删数问题
Description
Input
Output
注意结果不能有前置的零。
Sample Input
1372123
3
Sample Output
1123
在家无聊切了一道简单的贪心水题以下思路来自这里http://blog.****.net/c20190102/article/details/52350828
如果是直接删掉最大的数字,很容易便可举出反例:
1529 1
如果直接删最大的9,结果为152,如果删掉5,结果为129,显然删掉5才是最佳答案。
再看一组数据:
141519 2
如果删最大的9,5,结果为1411,如果删掉4,5,结果为1119,显然删掉4,5才是最佳答案。
发现什么了吗?
先看第一组:
1 5 1 9
小大 小 大
留删 留 留
第二组:
1 4 1 5 1 9
小 大 小 大 小 大
留 删 留删 留 留
删掉的是“山峰”,也就是比后一个数大的数,且越靠前“山峰”越早删。
大体思路也就一句话:删除靠前的“山峰”。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 char n[1001]; 6 int l,s; 7 cin>>n>>s; 8 l=strlen(n); 9 for(int i=1;i<=s;i++) 10 { 11 for(int j=0;j<l-1;j++) 12 if(n[j]>n[j+1]) 13 { 14 for(int k=j;k<l-1;k++) 15 n[k]=n[k+1]; 16 break; 17 } 18 l--; 19 } 20 int x=0; 21 int m=l; 22 while(n[x]=='0'&&m>1) 23 x++,m--; 24 for(int i=x;i<l;i++) 25 cout<<n[i]; 26 return 0; 27 }
完结,撒花~~
#include<bits/stdc++.h>using namespace std;int main(){ char n[1001]; int l,s; cin>>n>>s; l=strlen(n); for(int i=1;i<=s;i++) { for(int j=0;j<l-1;j++) if(n[j]>n[j+1]) { for(int k=j;k<l-1;k++) n[k]=n[k+1]; break; } l--; } int x=0; int m=l; while(n[x]=='0'&&m>1) x++,m--; for(int i=x;i<l;i++) cout<<n[i]; return 0; }
原文地址:https://www.cnblogs.com/sbwll/p/12960407.html
上一篇: 安卓 4.4 删除短信
推荐阅读
-
删数问题
-
[问题之书 1488:新的开始]问与答
-
[图像融合] 基于 Matlab 拉普拉斯金字塔图像融合[含 Matlab 746 问题]。
-
关于 VScode 无法安装插件、无法连接 App Store 的问题的真正解决方案--以及上述方法,在评论区随处可见:
-
苹果商务账户续费问题
-
与有限合伙企业合并报表有关的问题
-
RNN 教程系列 III | 基于时间的反向传播算法和梯度消失问题
-
从上海分时电价机制的调整看输电用户的电费结算问题
-
免费更换!在线付费燃气表即将登陆泰达,但有个问题 ......
-
解决 WSL Ubuntu 子系统在 windows 中忘记 root 和用户密码的问题 - 在 powershell 中执行 wsl.exe --user root