hdu 3183(A Magic Lamp)模拟
problem link adress:http://acm.hdu.edu.cn/showproblem.php?pid=3183
题目大意:给你一个整数(可能有1000位),然后你可以任意删除其中的m个数字,求删除这m个数后形成的新的数最小。不能改变数字的顺序,只能删除某数字。
ps: 题目给出我们的数据是没有前导0的,如果我们得出的新数据有前导0,那么我们可以忽略。例如:得到00125 可以直接输出125.
这一题彻底把我弄凌乱了,蛋疼了一下午,直接影响到接下来的比赛,这一题搞头昏脑胀的。
还是做题的习惯不好,考虑的太不全面,应该向涛哥学习把问题弄清楚在开始做题;
最基本的先把题目中给出的四个实例分析一下吧!
178543 4 /*去掉7 8 5 4
1000001 1 /*去掉1后 然后剩下000001 即1
100001 2 /*去掉1后 变成00001 再次去掉1 就变成了0
12345 2 /*去掉4 5
其中,这四个实例中第一个和第四个让我获得的信息就是对这些数字进行排序然后,去掉值最大的m为数字,可是不能改变顺序,这个想法pass。
接下来继续发现规律:如果不排序,是不是还应该去掉最大的数呢!下面的实例再次否定了我的想法。21435 如果只去掉1位,按照我的想法去掉5,变成2143,显然1435才是正确答案,所以得到了规律就是,不一定要最大数先去掉,而是与数的位数有关,也就是说从左到右,前一位的数不能大于后一位的数,如果大于就把它去掉,这样进行m次。
这样看来本题是贪心啊!

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 char num[1005]; 6 char ans[1005]; 7 int m; 8 int main() 9 { 10 int i; 11 while(scanf("%s %d",num,&m)!=EOF) 12 { 13 memset(ans,0,sizeof(ans)); 14 int len=strlen(num); 15 if(m==0)//如果m等于0的话直接输出 16 { 17 printf("%s\n",num); 18 continue; 19 } 20 int k=0; 21 for(i=0;i<len-1&&m>0;i++)//这里一定要确保m大于0 22 { 23 if(num[i]<=num[i+1]) 24 { 25 ans[k++]=num[i]; 26 } 27 else 28 { 29 m--; 30 while(ans[k-1]>num[i+1]&&m>0)//这里m一定要大于0 wa了几次 31 { 32 m--; 33 k--; 34 } 35 } 36 37 } 38 for(;i<len;i++) 39 { 40 ans[k++]=num[i]; 41 } 42 for(i=0;i<k-m;i++) 43 if(ans[i]!='0') 44 break; 45 if(i+m==k)//如果去除前导0后到达的位数和已经处理的位数和一共等于k位 直接输出0就ok了 46 cout<<"0"; 47 for(;i<k-m;i++) 48 cout<<ans[i]; 49 cout<<endl; 50 } 51 return 0; 52 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?