题目:
题目描述
(相关资料图)
小 A 有 n 个糖果盒,第 i 个盒中有 ai 颗糖果。
小 A 每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中糖的个数之和都不大于 x,至少得吃掉几颗糖。
输入的第一行是两个用空格隔开的整数,代表糖果盒的个数 n 和给定的参数 x。
第二行有 n 个用空格隔开的整数,第 i 个整数代表第 i 盒糖的糖果个数 ai。
输出一行一个整数,代表最少要吃掉的糖果的数量。
输入
3 32 2 2
输出
1
输入
6 11 6 1 2 0 4
输出
11
输入
5 93 1 4 1 5
输出
0
吃掉第 2 盒中的一个糖果即可。
第 2 盒糖吃掉 66 颗,第 4 盒吃掉 22 颗,第 6 盒吃掉 33 颗。
对于 30%30% 的数据,保证 n≤20,ai,x≤100。
对于 70%70% 的数据,保证 n≤103,ai,x≤105。
对于 100%100% 的数据,保证 2≤n≤105,ai,x≤109。
简单理解:
有n个数,每两个数之间不能超过x,求最少要减去多少才能满足前面的规定;
思路:
这题的知识点涉及到了模拟和贪心
一组一组的来判断是否大于x(一组就是第一个和第二个,第二个和第三个……),如果大于那么就要减糖果,现在就要想是要减第一个还是第二个呢?如果减一组中的第一个就不是最优解,因为减第二个是能同时减少两组的数量的,就第一组和第二组来说,第一个数是只被第一组包含的,二第二个数被一二两组同时包含,以此类推,所以减去第二个数是更优的选择
易错点:
1. 不要循环慢慢的减(“--box[i]”这样)会超时,第一次就是这样错的,要用算出来的公式
2. 要把计数变量写在减糖果操作的前面,减糖果的操作会改变box的值
前排说明一下公式(其实很简单):
(1)box[i]+box[i+1]-x 就是这一组糖果超过x的数量
(2)box[i+1]=x-box[i] 是: box[i+1] = box[i+1] - (box[i] + box[i+1] - x ) 的简化
(3)box[i]=x 是:box[i] = box[i] - [ (box[i] + box[i+1] - x) - box[i+1]] 的简化
代码:
#include <iostream>
using namespace std;
int box[100000],cnt;
int main()
{
int n,x;
cin>>n>>x;
for(int i=0;i<n;i++)cin>>box[i];/*输入*/
for(int i=0;i<n-1;i++){
if(box[i]+box[i+1]>x&&box[i]+box[i+1]-x<=box[i+1]){//判断是否两个盒子的糖果加起来超过了x,还判断了超过的数量是否大于第二个盒子的数量
/*这里是超过数量没有超过第二个盒子的数量*/
cnt+=box[i]+box[i+1]-x;(1)
box[i+1]=x-box[i];(2)
}else if(box[i]+box[i+1]>x&&box[i]+box[i+1]-x>box[i+1]){
/*这里是超过数量超过了第二个盒子的数量*/
cnt+=box[i]+box[i+1]-x;
box[i]=x;(3)
box[i+1]=0;
}
}
cout<<cnt;
}
上一篇 : 全球资讯:覆盖课后服务 新添生境花园
下一篇 : 最后一页
3月16日,盛和资源(600392)副总经理毛韶春、黄厚兵,财务总监夏兰田,董秘郭晓雷,通过上交所集中竞价交...
2022年3月15日,这是继1983年以来的第40个国际消费者权益日。中消协组织围绕共促消费公平消费维权年主题...
首批金控牌照的归属出炉,两家公司拿到许可证。3月17日,央行发布公告称,已批准中国中信金融控股有限公...
时隔半月之久,西宁市城北区逐步推动复工复产,往日的生机活力被渐渐寻回,牛肉面红油飘香、包子铺炊烟...
音乐是我生活的一部分,是我的梦想,也是我的事业。英国音乐人亚当(Adam)告诉记者,在中国的十几年里,...
Copyright © 2015-2022 热讯舞蹈网版权所有 备案号:豫ICP备20005723号-6 联系邮箱:29 59 11 57 8@qq.com