codeforces 1804D Accommodation
https://codeforces.com/problemset/problem/1804/D
解题思路
每个楼层是独立的,考虑怎么解决一层就可以了。
求最大值就是尽量避免1和1合并,也就是尽量在不存在连续1的子序列中进行合并,如果还有需要合并的就只能用1和1合并。求最小值就是尽量合并1和1。由于只需要输出最大最小值,所以遍历序列用贪心求解就行了。
/* https://codeforces.com/contest/1804/problem/D */ #include <bits/stdc++.h> using namespace std; int main() { int n, m, pre, num[2], sum, tmp[2], cnt, Max, Min; while (scanf("%d %d", &n, &m) != EOF) { Max = Min = 0; for (int i = 0; i < n; i++) { pre = -1; num[0] = num[1] = 0; sum = tmp[0] = tmp[1] = 0; for (int j = 0; j < m; j++) { char c = getchar(); if (c == '\n') { j--; continue; } cnt = c == '0' ? 0 : 1; sum += cnt; if (num[0] == 0) { pre = cnt; num[0]++; } else { if (cnt == 0) { pre = cnt; num[0]++; } else { if (pre == 0) { pre = cnt; num[0]++; } else { pre = cnt; tmp[0] += num[0] / 2; num[0] = 1; } } } if (cnt == 0) { if (num[1] != 0) { tmp[1] += num[1]/2; num[1] = 0; } } else { num[1]++; } } if (num[0] != 0) { tmp[0] += num[0]/2; } if (num[1] != 0) { tmp[1] += num[1]/2; } Max += sum - (m/4 - min(m/4, tmp[0])); Min += sum - min(m/4, tmp[1]); } cout << Min << " " << Max << endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具