Codeforces 1330 C. Dreamoon Likes Coloring

在这里插入图片描述

题意:

一行上有 n n 个方格,给出每个颜色染色的长度 l i l_i ,可以选择从 [ 1 , n l i + 1 ] [1,n−l_i+1] 中的一处开始染色,问能否给每个方格染上颜色并且可以看到每一种颜色。

每个颜色染色的起点应不小于自己序次对应的方格。

无解的情况:

  • 若总染色长度小于 n n ,最终一定会有方格没有颜色。

  • 若某个颜色的最大起点在前面的方格中,此时会覆盖先前至少一种颜色。

染色时的情况:
假设每个颜色互不覆盖能染的最大长度为 s u m sum n s u m + 1 n−sum+1 即为该颜色段的起点。

n s u m + 1 n−sum+1 大于当前方格位置,说明如果从当前方格处开始染色最终一定会有空白的方格,此时至少要从 n s u m + 1 n−sum+1 处染色才能给每个方格染色。
n s u m + 1 n−sum+1 小于当前方格位置,说明接下来一定会有颜色相覆盖,此时保证每个颜色至少染上自己对应的方格即可。

AC代码:

const int N = 1e5 + 10;
int a[N], ans[N];
int n, m;
int res, tmp, now;
ll sum;
int main()
{
	sum = 0;
	sdd(n, m);
	rep(i, 1, m)
	{
		sd(a[i]);
		sum += a[i];
	}
	if (sum < n)
	{
		puts("-1");
		return 0;
	}
	rep(i, 1, m)
	{
		if (a[i] > (n - i + 1))
		{
			puts("-1");
			return 0;
		}
		ans[i] = i;
	}
	now = n;
	per(i, m, 1)
	{
		if (now - a[i] + 1 <= i)
		{
			ans[i] = i;
			break;
		}
		ans[i] = now - a[i] + 1;
		now -= a[i];
	}
	rep(i, 1, m)
		printf("%d%c", ans[i], i == n ? '\n' : ' ');
	return 0;
}
发布了786 篇原创文章 · 获赞 460 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/105319227