CF-div2-631-C

参考链接1:https://blog.csdn.net/mrcrack/article/details/105310808
参考链接2:https://www.xht37.com/codeforces-round-631-div-1-thanks-denis-aramis-shitov-题解/
参考链接3:https://blog.csdn.net/qq_42968686/article/details/105315793

题意:所有格子都被染色,并且每一种颜色都能被看到

先理解题目的各种边界,
反向,第i次就最多选到i,贪心选最大的染色区间,最大染色部分为 [n-l[i]+1 ~ n]
如果,选择的pi比i小(有可能导致前i个染不到色的情况) 移动一下 移动到i (让i-1个也能染上不一样的颜色)

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
typedef long long ll;
int l[maxn],p[maxn];
ll sum = 0;
int n,m;
bool flag = false;

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++) p[i] = i;
	for(int i=1;i<=m;i++){
		cin>>l[i];
		sum += l[i];
		if(i > n-l[i]+1) flag = true;
	}
	if(sum < n) flag = true;
	if(flag){
		puts("-1");
		return 0;
	}
	n = n + 1;
	for(int i=m;i>=1;i--){
		n = n - l[i]; //贪心选最大使得染色部分为 n-l[i]+1 ~ n 
		p[i] =  n;
		if(p[i] < i){ //比i小 移动一下 移动到i (让i-1个也能染上不一样的颜色)
			n = i;
			p[i] = i;
		}
	}
	for(int i=1;i<=m;i++) cout<<p[i]<<" ";
	return 0;
} 
原文地址:https://www.cnblogs.com/fisherss/p/12643719.html