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