ACM程式設計選修課——1031: Hungar的得分問題(二)(楊輝三角+二進位制轉換)
阿新 • • 發佈:2019-01-26
1031: Hungar的得分問題(二)
時間限制: 1 Sec 記憶體限制: 64 MB提交: 15 解決: 10
[提交][狀態][討論版]
題目描述
距離正式選秀時間越來越近了,今天Hungar打算組織一場比賽!
於是他和其他4名隊員組成了一支隊伍,比賽就此開始,然而計分器似乎出了點問題,Hungar驚奇得發現,當第一次得分時,計分器顯示的是4,第二次是7,第三次是44.....
Hungar馬上發現,這些顯示的數字只包含4和7,他突然想知道,給定一個這樣的數字,它的排名是多少?
輸入
第一行一個整數T(T <=100), 代表有T組資料.
對於每一組資料,包含一個整數n(1 <= n <= 10^9).
輸出
n的排名.
樣例輸入
34777
樣例輸出
126
提示
輸入資料保證合法(即n只包含4和7)
排名從小到大開始排.
例如排在第1的是4,排在第2的是7......
為數不多的仔細思考想出的題,剛開始只知道算可以求前面幾次的次數sum(N:1~s.size-1,列在紙上可以構成楊輝三角),但是到n以為是個next_permutation,然後打表看了下資料比較大的情況下早過萬了,用next估計超時,然後想半天找到了4和7出現的相對位置與本次序數關係——首先將4與7化為2進位制的0與1,然後轉換為十進位制,再加上前面的sum,即可得到答案。似乎遞推順序並非按字典序...與next的順序只有幾組符合答案,糾結半天想碰碰運氣結果AC了#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<queue> #include<set> #include<map> #include<sstream> #include<algorithm> #include<cmath> #include<cstdlib> using namespace std; int poww(int n) { int sum=1; for (int i=1; i<=n; i++) sum*=2; return sum; } int bi_to_dec(string s)// { int sum=0; for (int i=0; i<(int)s.size(); i++) { sum=sum*2+s[i]-'0'; } return sum; } void change(string &s)//轉換為2進位制 { for (int i=0; i<(int)s.size(); i++) { if(s[i]=='7') s[i]='1'; else if(s[i]=='4') s[i]='0'; } } int main (void) { string s; int t; cin>>t; getchar(); while (t--) { getline(cin,s); int len=(int)s.size(); int ans=poww(len)-1;//計算前n-1組的sum change(s); ans=ans+bi_to_dec(s);//加上本次的序數 cout<<ans<<endl; } return 0; }