1038 Recover the Smallest Number
1038 Recover the Smallest Number (30 point(s))
思路1
給定一串的數(shù)字 可以隨意改變他們的順序 求出最小的數(shù)字的組合
輸出注意點,最前面沒有0
正確思路
? a = 32 ;
? b =321;
如上 兩個字符串,如果構(gòu)成數(shù)字可得到 1) 32-321
? 2) 321-32
? 32321>32132;
? 故后者是相對比較小的數(shù)字。
? 于是本問題轉(zhuǎn)化成為排序問題。數(shù)字的大小的比較 在字符串上可以用字典序來比較。
? 所以如果 string a =32; string b =321;
? 根據(jù) a+b<b+a 即可判斷正確的順序
最后再處理一下輸出字符串 的前面的0;
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std;bool cmp(const string &a,const string &b){return a+b<b+a; }vector<string> N; int main(){int Cnt =0;cin>>Cnt;for(int i = 0; i < Cnt; i++){string temp;cin>>temp;N.push_back(temp);}sort(N.begin(),N.end(),cmp);string res;for(int i=0;i<N.size();i++){res+=N[i];}int i= 0;for(i =0;i<res.length();i++){if(res[i]!='0'){break;}}if(i==res.length()){cout<<0;}else{for(;i<res.length();i++)cout<<res[i];}cout<<endl;return 0; }這個是大多數(shù)人的思路。也是十分簡介的一種解法。
思路2
? 這個是我自己的想法,將字符串轉(zhuǎn)化成 數(shù)字來比較。
? 可以想到 如果要一些數(shù)字組成的 數(shù)字要最小 那么在這些數(shù)字種,最小的數(shù)字一定是在最前面。
? 用以下結(jié)構(gòu)存儲數(shù)字 cal() 將得到的字符串轉(zhuǎn)換成8位數(shù)字,后面用數(shù)字的最后一位補齊。例如 32=> 32222222
? 321=> 32111111
? 而32111111< 32222222
? 所以321 應該排在32 前面。
struct node{string num_s;unsigned long num;void cal(){int len =num_s.length();num=0;for(int i=0;i<8;i++){num*=10; if(i<len){num+=num_s[i]-'0'; }else{num+=num_s[len-1]-'0';}}} };?
? Sample Input:
5 32 321 3214 0229 87過程如下 32222222 32111111 32144444 02299999 87777777 排完序如下 02299999 0229 32111111 321 32144444 3214 32222222 32 87777777 87但是有兩個測試點過不去。很難受。
總結(jié)
以上是生活随笔為你收集整理的1038 Recover the Smallest Number的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求到达必败态的方法数 ZOJ 3067
- 下一篇: Flash XSS 漏洞实例