P1106 删数问题

1|0P1106删数问题

1|0对2018年的我一次完美的对位单杀

1|02018 44pts Code

#include<cstdio> #include<iostream> #include<algorithm> using std::cin; using std::cout; using std::sort; using std::pair; using std::string; string zsk_lu_ping; struct zsksb { int place; int w; bool operator < (const zsksb & rhs) const{ return w>rhs.w; } }zsk_chao_ti_jie[43534]; int d; int vis[3434]; int main(void) { cin>>zsk_lu_ping; cin>>d; for(int i=0;i<zsk_lu_ping.length();i++) { zsk_chao_ti_jie[i].place=i; zsk_chao_ti_jie[i].w=zsk_lu_ping[i]-'0'; } sort(zsk_chao_ti_jie,zsk_chao_ti_jie+zsk_lu_ping.length()); for(int i=0;i<d;i++) { vis[zsk_chao_ti_jie[i].place]=1; } for(int i=0;i<zsk_lu_ping.length();i++) { if(!vis[i]) { cout<<zsk_lu_ping[i]; } } }

先来看看为什么错,2018年的做法是无脑找前K大的数,然后删去,这是存在问题的。

比如13928 2。如果按照这个算法,我会删去9、8,剩余的数是132。而显然删去3、9,剩余的数是128是一个更好的解法。

1|02023 72pts Code

#include <iostream> using namespace std; string s; int k, minn, minP, sum; char ans[300]; int main() { cin >> s >> k; for (int i = 0; i < s.length(); i++) { minn = 100; for (int j = i; j <= i + k; j++) { if (minn > s[j] - '0') { minn = s[j] - '0'; minP = j; } } k -= minP - i; i = minP; ans[sum++] = s[minP]; } for (int i = 0; i < sum; i++) { cout << ans[i]; } return 0; }

时隔五年,我重做这道题目,放下浮躁慢慢想。

我事先知道这是贪心,把题目转化为这样一个问题

从当前最高位开始,在右端k位中寻找最小值,将最小值转到最高位,并将最高位移至最小值所在位的下一位。k减去最小值移动的位数。

这是一个正确的贪心。但我没有处理ans中的前导零,处理完细节后拿下AC.

#include <iostream> using namespace std; string s; int k, minn, minP, sum, isFirst; char ans[300]; int main() { cin >> s >> k; for (int i = 0; i < s.length(); i++) { minn = 100; for (int j = i; j <= i + k; j++) { if (minn > s[j] - '0') { minn = s[j] - '0'; minP = j; } } k -= minP - i; i = minP; ans[sum++] = s[minP]; } for (int i = 0; i < sum; i++) { if (ans[i] == '0' && !isFirst) { continue; } isFirst = true; cout << ans[i]; } if (!isFirst) { cout << 0; } return 0; }

__EOF__

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