Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring(贪心)
题意:给n个格子,m种颜色要求涂完所有格子且最后每种颜色至少有一个。
思路:显然:有两种情况是不成立的:
为什么是这两种情况:对pos1:显然格子涂不完。对pos2:显然前面 i - 1 次操作最少占用的格子为 i -1 个,如果 第 i 次操作的范围+ 前i -1次的占用格子 大于 n,则不符合题意,因为 pi 要满足[1,n-li+1],即每次操作不能涂超过n的区域。
除此外,其他情况显然可以,根据贪心思想:对于当前操作,在能涂完所有格子的情况下尽可能多的为后面的格子腾出空间,且不对前面颜色数有影响是最优的。可以通过后缀和表示当前能涂的最大范围,与i(最小值)进行max比较即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n,m;
cin>>n>>m;
ll a[n+1],sum=0,f=0;//sum用来储存后缀和通过减a[i]实现
for(int i=1;i<=m;i++){
cin>>a[i],sum+=a[i];
if(i-1+a[i]>n) f=1;
}
if(sum<n||f){//pos1 and pos2
puts("-1");
return 0;
}
for(ll i=1;i<=m;sum-=a[i],i++){
printf(i==m?"%lld\n":"%lld ",max(i,n-sum+1));
}
return 0;
}