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;
}