pat1038
? 這一問就是要將找出各個字符串如何組合才能使得組成的數字最小;
首先我的思路是:關鍵在于如何尋找任何兩個字符串的排列方式,寫成一個cmp的bool類型函數,然后用sort,將其排序,然后將所有的字符串相連接成一個較長的字符串,最后輸出來,注意去掉前面的0;
在寫cmp函數時,我的思路是:從前到后比較兩個字符串的每一位,找到第一位不同的時候就返回這位數字的大小比較,如果直到一個字符串結束時都全部一樣,就將較短的那個的第一位和較長的那個字符串的對應位比較,例如比較234和23時將2和4比較。
特別注意:在cmp函數中如果有多個比較的時候要注意將較小的部分放成相同的
后來發現這種方法容易出錯,借鑒了一下大佬的:可以考慮兩個字符串加起來后先后順序的比較,例如234和34時,只比較23434和34234就可以了,然后注意一下轉化函數stroi。。。其實很好記,string to int
最后有個小坑。。當所有的都是0的時候要記得輸出一個0。
// // main.cpp // 1038 // // Created by DouglasLee on 18/3/3. // Copyright ? 2018年 DouglasLee. All rights reserved. //#include <iostream> #include<string.h> #include<algorithm> #include<vector> using namespace std; vector<string> s; bool cmp1(string s1,string s2){string ss1=s1+s2;string ss2=s2+s1;long k1=stol(ss1);long k2=stol(ss2);return k1<k2; } bool cmp(string s1,string s2){int po=0;int flag=0;while(s1[po]!='\0'&&s2[po]!='\0'){if(s1[po]==s2[po])po++;else{flag=1;break;}}if(flag==1)return s1[po]<s2[po];else if(s1.length()<s2.length()){//s1?比較短,到頭了return s1[0]<s2[po];}elsereturn s1[po]<s2[0]; }int main(int argc, const char * argv[]) {int n;cin>>n;for(int i=0;i<n;i++){string tmp;cin>>tmp;s.push_back(tmp);}sort(s.begin(),s.end(),cmp1);int size=s.size();int p=0;string ss;for(int i=0;i<size;i++){ss+=s[i];//cout<<s[i];}while(ss[p]=='0')p++;int kkk=0;while(ss[p]!='\0'){cout<<ss[p++];kkk++;}if(kkk==0)cout<<0;return 0; }總結
- 上一篇: hdu1038
- 下一篇: 关于“socket:10106 无法加载