Codeforces Round #631 (Div. 2) C. Dreamoon Likes Coloring(貪心)

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章