Educational Codeforces Round 160 (Rated for Div. 2)

1|0基本情况

A题秒了。

B题卡了实在太久,BC题最后虽然都过了,但是耗时太久。感觉C对我来说更好写。

2|0B. Swap and Delete

经典+3。

总是一条路偏要走到黑了才会想着换思路,早该换了。

一开始想了一大堆乱七八糟的思路,但都错了。

后面往简单了想,这题毕竟最后必须要左对齐的,直接从左往右比对,从这角度出发想做法,终于想出来了。

我们从左到右逐位处理, 对不用删除的数目 t 进行统计:

if (s[i] == '0') { if (cnt[1] > 0) cnt[1]--, t++; else break; }
  • 前半部分思路很简单,其实我前面乱试的时候也有想到:

    从左往右比对,如果这一位是 0,那肯定需要 1,如果此时 1 的数目够,就直接给,然后把不用删除的数目加一。

  • 但是当 1 的数目不够时,是个难点,我前面没有抓住这个问题:

    事实上,一旦需要的 1 已经没有了,那么后面所有的数必然都是 0,那么怎样操作都无法让这一位变成 1 了,只能把后面的数全删了。因此直接退出对不用删的数目的统计,输出答案。

void solve() { std::string s; std::cin >> s; int n = s.length(), t = 0;//不用删除,只靠移动就可以的数目 cnt[1] = cnt[0] = 0; for (int i = 0; i < n; i++) if (s[i] == '1') cnt[1] ++; else cnt[0]++; for (int i = 0; i < n; i++) { if (s[i] == '0') { if (cnt[1] > 0) cnt[1]--, t++; else break; } else { if (cnt[0] > 0) cnt[0]--,t++; else break; } } std::cout << n - t <<std::endl; }

__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17913506.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(66)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示