题目传送门
题目大意是有一个序列,让你在这个序列上的某些数上增加它的数值使得这个序列中的任意两个相邻的数的和均不小于 k k k。
思路
贪心思想。
我们不难想到如果这个数的左右两边均有数,那么最优策略一定是在它身上增加数值使得两边均不小于 k k k,这样所增加的数值也是最小的。
于是,我们对代码整体也有了一定把握,对于队首,我们增加第二个数使他们不小于 k k k,对于队尾,我们增加倒数第二个数使他们不小于 k k k,对于其余的数均是对自身进行改动。
随时累加增加数值,更改序列中的元素,最后输出即可。
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAXN 600
using namespace std;
int n,k;
int f[MAXN],ans;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&f[i]);
for(int i=2;i<=n;i++){//取i与i-1,于是从2开始
if(f[i]+f[i-1]<k){//此时需要更改数值
int t=k-f[i-1];//t是f[i]要到的最小数值
ans+=(t-f[i]);//累加增加的数值
f[i]+=(t-f[i]);//更改f[i]使之达到符合条件的最小值
}
}
printf("%d\n",ans);
for(int i=1;i<=n;i++)
printf("%d ",f[i]);
//输出
return 0;
//完结撒花~~
}