题目链接:https://vjudge.net/problem/CodeForces-1329A
题意: 给定n个空格子,有m种颜色,每种颜色使用使用可以涂抹连续mi个格子(不能少于mi个格子),要求最后所有格子都涂有颜色,且每种颜色至少存在一个格子中(先涂的颜色被后涂的覆盖),输出其中一种可行解
题解: 参考 https://www.freesion.com/article/6479440622/
有2个要求:所有颜色用上;所有格子涂有颜色
假设只考虑前者,则直接i号颜色涂在起始点i处即可,但是有可能后面会有空格子没涂上颜色
只考虑后者,则从左到右涂,相邻2种颜色刚好毗邻不相交,但是可能会有颜色没用上
所以尝试2种方法综合使用,先第一种,然后进行调整,
每次把最右边的颜色调整到最右边,删去这种颜色占有的格子,如果右边还有空白,重复刚才的步骤即可
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 100010; int n, m; ll tot = 0; int ans[N]; int e[N]; void print() { for(int i = 1; i <= m; i++) { printf("%d ", ans[i]); } } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= m; i++) { scanf("%d", &e[i]); if(i+e[i]-1 <= n) ans[i] = i; else { printf("-1"); return 0; } } if(e[m]+ans[m]-1 > n) { printf("-1"); return 0; } if(e[m]+ans[m]-1 == n) { print(); return 0; } int nowp = n; for(int i = m; i >= 1; i--) { if(ans[i] + e[i] - 1 < nowp) { ans[i] = nowp - e[i] + 1; nowp = ans[i] - 1; } else nowp = ans[i] - 1; } if(nowp != 0) { printf("-1"); return 0; } print(); return 0; }
Codeforces 1329A Dreamoon Likes Coloring ----- 贪心
最新推荐文章于 2020-12-09 19:13:00 发布