Educational Codeforces Round 106 (Rated for Div. 2)

1|0Educational Codeforces Round 106 (Rated for Div. 2)

1|1A题 Domino on Windowsill

原题链接

1|0题意

给定一个2×n 的网格, 第一行前x个和第二行前y个格子为白色, 其余格子为黑色. 现在给定a2×1的白块, b2×1的黑块, 问能否将分别将白块和黑块全部放入对应颜色的区域, 且不能相互重叠.

1|0思路

A题比较水(A题不水, 还怎么做), 因为是给定第一行前x个和第二行前y个格子为白色,则竖着最多填min(x,y)个白块, 横着最多填(xy)/2(下取整)个白块, 黑块同理,最后检查输入是否合法就行.

#include <iostream> #include <cstring> #include <algorithm> #include <map> using namespace std; void solve() { int n, k1, k2; int k3, k4; int w, b; cin >> n >> k1 >> k2; k3 = n - k1; k4 = n - k2; cin >> w >> b; if (k2 > k1) swap(k1, k2); if (k4 > k3) swap(k3, k4); int sumw = k2 + (k1 - k2) / 2; int sumb = k4 + (k3 - k4) / 2; //cout << sumw << ' ' << sumb << endl; if (sumw >= w && sumb >= b) puts("YES"); else puts("NO"); return; } int main() { int t; cin >> t; while (t -- ) solve(); return 0; }

1|2B题 Binary Removals

原题链接

1|0题意

给定一个01序列, 从中删去一些01, 使得这个序列为有序递增序列, 要求删去的数字的下标不能相邻.

1|0思路

这题把我搞蒙了.后来发现道题有点DP的意思.
首先,当序列中出现00或者是11这样的子序时,我们可能是没办法处理的,即结果为NO
定义两个数组:

  1. a: ai表示从1i是否出现11序列, 出现为1,否则为0
  2. b: bi表示从in是否出现00序列, 出现为1,否则为0

若存在ai=bi=1, 说明1i存在11序列, 同时in存在00序列, 这样是无法满足要求的。
那么我们先从前向后递推出a, 再从后向前递推出b, 最后检查是否存在ai=bi=1, 若存在,不合法。

#include <iostream> #include <cstring> #include <algorithm> #include <map> using namespace std; int a[110]; int b[110]; string s; void solve() { cin >> s; memset(a, 0, sizeof a); memset(b, 0, sizeof b); for (int i = 1; i < s.size(); i ++ ){ if (a[i - 1]) a[i] = 1; if (s[i] == '1' && s[i - 1] == '1') a[i] = 1; } for (int i = s.size() - 2; i >= 0; i -- ){ if (b[i + 1]) b[i] = 1; if (s[i + 1] == '0' && s[i] == '0') b[i] = 1; } for (int i = 0; i < s.size(); i ++ ) if (a[i] && b[i]){ puts("NO"); return; } puts("YES"); return; } int main() { int t; cin >> t; while (t -- ) solve(); return 0; }

1|3C题 Minimum Grid Path

原题链接

1|0题意

给定一个 n×n 的网格, 要求最多走 n 步(只能向上或向右, 但每次走的格子数不限, 且必须交替进行), 同时给定选择走i步时走每一格的代价 wi ,问从 (0,0)(n,n) 的最小代价。

1|0思路

暴力做肯定会超时的, 题目有一个很好的性质:向上和向右必须交替进行, 而且因为是个正方形, 第一步向上还是向下结果都是一样的。
因此我们可以枚举从起点到终点所需要的步数(从 1n ):

  1. 首先, 我们规定奇数向右, 偶数向下.
  2. 当枚举到 i 时, 表示前i步我们每个选择一格, 剩下的两个方向的格子都由i之前的最小值来走。
  3. 注意动态维护两个方向的最小值和剩余格子。
#include <iostream> #include <cstring> #include <algorithm> #include <map> using namespace std; typedef long long LL; const int N = 1e5 + 10; LL a[N]; void solve() { LL n; cin >> n; LL ans; LL minup; LL mindown; LL up = n; LL down = n; for (int i = 1; i <= n; i ++ ) cin >> a[i]; LL sum = a[1] + a[2]; down = n - 1; up = n - 1; ans = a[1] * n + a[2] * n; minup = a[1]; mindown = a[2]; for (int i = 3; i <= n; i ++ ){ sum += a[i]; if (i % 2){ up--; minup = min(minup, a[i]); }else{ down--; mindown = min(mindown, a[i]); } //cout << up << " " << down << " " << minup << " " << mindown << endl; ans = min(ans, sum + mindown * down + minup * up); } cout << ans << endl; return ; } int main() { int t; cin >> t; while (t -- ) solve(); return 0; }

__EOF__

本文作者lhqwd
本文链接https://www.cnblogs.com/lhqwd/p/14560449.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   lhqwd  阅读(104)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示