日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

1038 Recover the Smallest Number

發布時間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1038 Recover the Smallest Number 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1038 Recover the Smallest Number (30 point(s))

思路1

給定一串的數字 可以隨意改變他們的順序 求出最小的數字的組合

輸出注意點,最前面沒有0

正確思路

? a = 32 ;

? b =321;

如上 兩個字符串,如果構成數字可得到 1) 32-321

? 2) 321-32

? 32321>32132;

? 故后者是相對比較小的數字。

? 于是本問題轉化成為排序問題。數字的大小的比較 在字符串上可以用字典序來比較。

? 所以如果 string a =32; string b =321;

? 根據 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; }

這個是大多數人的思路。也是十分簡介的一種解法。

思路2

? 這個是我自己的想法,將字符串轉化成 數字來比較。

? 可以想到 如果要一些數字組成的 數字要最小 那么在這些數字種,最小的數字一定是在最前面。

? 用以下結構存儲數字 cal() 將得到的字符串轉換成8位數字,后面用數字的最后一位補齊。例如 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

但是有兩個測試點過不去。很難受。

總結

以上是生活随笔為你收集整理的1038 Recover the Smallest Number的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。