您当前的位置: 首页 > 

对方正在debug

暂无认证

  • 7浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C. Color the Picture(贪心/构造)

对方正在debug 发布时间:2022-07-27 23:57:39 ,浏览量:7

题目

题意

给定n * m的矩阵,用k种染料去涂这些格子。每种燃料有a[i]个。 要求涂抹后的每个格子,它的相邻格子,至少有3个是相同颜色。 这里相邻格子的定义比较特殊。对于(x1,y1)和(x2,y2),它们相邻,当且仅当满足以下其中之一。 在这里插入图片描述

比如对于下图,(1,2)的相邻格子是4个灰色结点。 在这里插入图片描述

思路

为了保证每个结点有3个同色的相邻结点,那么它至少有3个方向的格子是相同颜色的。 这意味着,我们构造的同色格子,要么是占据至少2行的,要么是占据至少2列的。 不失一般性,我们下面只讨论按列划分的情况。

问题转化为,给定m列,如果用k种燃料去填充每以列,使得每种燃料至少有填充2列以上。

  • 为了尽量不浪费燃料,我们需要优先使用数量多的燃料。
  • 为了能尽量利用每种燃料,我们需要尽量让每种燃料都用上。

为了满足第一条件,我们需要优先从数量大的燃料开始取; 为了满足第二条件,我们需要每种燃料都只取2列,多余的再额外记录下。

详见代码res和left变量。

代码
#include 
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int maxn = 200010;

int n, m, k;
ll a[maxn];
void solve() {
	scanf("%d%d%d", &n, &m, &k);
	for (int i = 1; i = 1; --i) {
		ll tmp = a[i] / n;
		tmp = min(tmp, m - res);// 这里是防止剩余的列数不够 
		if (tmp = m;
	
	// 2. color every row
	res = 0;left = 0;
	for (int i = k; i >= 1; --i) {
		ll tmp = a[i] / m;
		tmp = min(tmp, n - res);
		if (tmp = n;
	

	printf("%s\n", ok ? "YES" : "NO");
	
}
int main() {
	int t;
	scanf("%d", &t);
//	t = 1;
	while (t--) {
		solve();
	}
}
最后

weixin gongzhonghao搜 对方正在debug,关注下,一起快乐刷题吧~

关注
打赏
1664895754
查看更多评论
立即登录/注册

微信扫码登录

0.0365s