rqnoj-257
来源:互联网 发布:vb.net sqlite 编辑:程序博客网 时间:2024/05/01 02:37
由于正整数n的有效位数最大可达255位,所以可以采用字符串类型来存储n。那么,应如何来确定
该删除哪s位呢?是不是只要删掉最大的n个数字就可以了呢?
为了尽可能地逼近目标,我们选取的贪心策略为:每一步总是选择一个使剩下的数最小的数字删去,
即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字,否则删除第一个递减区间的首字符。然后回到串首,按上述规则再删除下一个数字。
重复以上过程s次,剩下的数字串便是问题的解了。例如:对s=178543,n=4,删数的过程如下:
s=178543 {删掉8}
s=17543 {删掉7}
s=1543 {删掉5}
s=143 {删掉4}
s=13 {解为13}
这样,删数问题就与如何寻找递减区间首字符这样一个简单的问题对应起来了。
该删除哪s位呢?是不是只要删掉最大的n个数字就可以了呢?
为了尽可能地逼近目标,我们选取的贪心策略为:每一步总是选择一个使剩下的数最小的数字删去,
即按高位到低位的顺序搜索,若各位数字递增,则删除最后一个数字,否则删除第一个递减区间的首字符。然后回到串首,按上述规则再删除下一个数字。
重复以上过程s次,剩下的数字串便是问题的解了。例如:对s=178543,n=4,删数的过程如下:
s=178543 {删掉8}
s=17543 {删掉7}
s=1543 {删掉5}
s=143 {删掉4}
s=13 {解为13}
这样,删数问题就与如何寻找递减区间首字符这样一个简单的问题对应起来了。
要注意一个细节问题:可能会出现字符串首部有若干个0(甚至整个字符串都是0)的情况。
#include<cstdio>#include<cstring>const int MAXN=255+10;int len,n;char s[MAXN];void Delete(int x){ for(int i=x;i<len;i++) s[i]=s[i+1]; len--;}int main(){ //freopen("d:\\test.txt","r",stdin); scanf("%s",s); scanf("%d",&n); len=strlen(s); for(int i=0;i<len;i++) { if(n<=0) break; if(s[i]>s[i+1]) { Delete(i); i=-1; n--; } } int ans; sscanf(s,"%d",&ans);//舍弃前面的0 printf("%d\n",ans); return 0;}
- rqnoj-257
- rqnoj-332 & rqnoj-53
- RQNOJ 164
- RQNOJ 311
- RQNOJ 34
- 决斗 RQNOJ
- rqnoj-153
- rqnoj-394
- rqnoj-3
- rqnoj-12
- rqnoj-93
- rqnoj-4
- rqnoj-1
- rqnoj-2
- rqnoj-20
- rqnoj-15
- rqnoj-16
- rqnoj-69
- PCI8524 并行8Ch24Bits100Ksps高精度数据采集卡
- Java中的引用概念
- JDK下载地址
- 写2章的书,挖掘机+LabVIEW
- Java基础之循环的使用
- rqnoj-257
- 学习tcp/ip应记住的东西
- jquery分页详解
- Displaying a List
- Configuring Fedora Linux Remote Access using SSH
- find命令使用
- eclipse在HTC Desire V上真机调试运行Android程序
- 【TCP/IP学习笔记1】 &C语言讲解
- Feathers组件--之--列表