hdu 3183
来源:互联网 发布:方便面 知乎 编辑:程序博客网 时间:2024/05/16 11:49
思路:http://blog.csdn.net/LYHVOYAGE/article/details/38379685
题意:给出一个不超过1000位的数,求删去m个数字以后形成的最小的数是多少。
分析:我们可以把题目转化为这样一个模型:从A[1]、A[2]、……、A[n] n个数中选出n-m个数,使得组成的数最小。
一、使用RMQ,设原数字长为n,那么除去m个数字后还剩n-m个数字。
(1)因为有n-m个数字,那么在1到m+1位置中最小的那个数字必是结果中的第一个数字,记录其位置为pos
(2)然后从这个位置的下个位置pos+1开始到m+2位置的数字中最小的那个数字必定是结果中第二个数字,以此类推下去向后找。
(3)为了保证数字最小,所以要保证高位最小,还要保证数字长度满足条件
(1)因为有n-m个数字,那么在1到m+1位置中最小的那个数字必是结果中的第一个数字,记录其位置为pos
(2)然后从这个位置的下个位置pos+1开始到m+2位置的数字中最小的那个数字必定是结果中第二个数字,以此类推下去向后找。
(3)为了保证数字最小,所以要保证高位最小,还要保证数字长度满足条件
注意:数组的控制,下标从0开始,上面的1~m+1变为0~m,以下类同
pos++位置改了几次,一开始没想好,先加的话num【0】的比较就没有了。
输出要注意先导0的末尾的0,注意判断,一开始是0就除掉了......
#include<iostream>#include<cstring>using namespace std;char num[1006],ans[1006];char min(char a,char b){ return a>b?b:a;}int main(){ int n,m; while(cin>>num) { cin>>m; n=strlen(num); memset(ans,0,sizeof(ans)); //cout<<"num:"<<num<<" "<<"m:"<<m<<" "<<n<<endl; char minn; int pos=0,k=m; for(int i=0;i<n-m;i++) { minn=num[pos]; // cout<<minn<<endl; // pos++; for(int j=pos;j<=k+i;j++) { if(num[j]<minn) { minn=num[j]; pos=j; ans[i]=minn; } else ans[i]=minn; // cout<<minn<<endl; } pos++; } int flage=0; for(int i=0;i<n-m;i++) { if(ans[i]=='0'&&flage==0) { continue; } else { flage=1; cout<<ans[i]; } } if(flage==0) cout<<"0"; cout<<endl; } return 0;}
0 0
- HDU 3183
- hdu 3183
- hdu 3183
- hdu 3183
- HDU 3183
- 贪心算法(hdu 4442 hdu 3183)
- HDU 3183 RMQ
- hdu 3183 RMQ 应用
- hdu 3183 (查找)
- hdu 3183 RMQ
- hdu 3183(贪心)
- hdu 3183 Rmp查询
- HDU 3183 RMQ
- hdu-3183(贪心+RMQ)
- HDU 3183 贪心
- hdu
- hdu
- HDU
- 单例模式的七种写法
- Selenium2.0之WebDriver
- 定时关机重启
- 酷和时尚的Burberry太阳眼镜
- Android短彩信数据库解析
- hdu 3183
- 360极速浏览器对于z-index的特殊处理方式
- cocos2dx 定义全局变量(C++)
- 如何让Activity背景透明
- hdu 2095 find your present (2) 找到只出现一次的数字
- Hibernate_12_HQL语句查询
- 那目不转睛的气味 - 最佳香水女性必看
- java Calendar详解
- CSS中class之间的空格