HDU-4278 Faulty Odometer 数学递推 || 八进制
生活随笔
收集整理的這篇文章主要介紹了
HDU-4278 Faulty Odometer 数学递推 || 八进制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意
這個里程表當走到3或8的時候就會跳過 給我們這個里程表上顯示的數字
讓我們求這個里程表的真實數據是多少
分析
由于 3 和 8 不存在 那么就相當于一個八進制數 但是這個八進制中3 是寫作4 8是寫作9
那么就好寫了 也就是把數入的“特別八進制數”轉化成一個十進制數
還有一個方法就是推每一位具體是少了多少個數
做題的時候一開始想往數位dp上想
結果Z犇一下就想到了遞推 !!
通過對輸入數據的每一位進行遞推 看看到底少了多少個數
比如當推導數位長度等于2 時 少了: C(2,1)?10+(10?2)?2=36
前面的是當首位是3或8 的時候 后面一位有10種情況 后面的是 當首位非3,8 有8種情況后面一位或3或8
比如當長度為3的時候 : C(2,1)?10?10+(10?2)?num[兩位的情況] 這里也就相當于遞推了
code
八進制:
#include<bits/stdc++.h> using namespace std; int main() {int n;while(scanf("%d",&n),n){int tmp = n,sum,p;p=1;sum=0;while(tmp){int b = tmp%10;if(b>8)b-=2;else if(b>3)b-=1;sum+=b*p;p*=8;tmp/=10;}cout<<n<<": "<<sum<<endl;}return 0;}遞推:
#include<bits/stdc++.h> using namespace std; typedef long long ll; int t[11]; ll pow(ll a,ll b){ll ans = 1;while(b){if(b&1)ans*=a;a*=a;b>>=1;}return ans; }int main() {int n;t[0]=0,t[1]=2;for(int i=2;i<=9;i++){t[i] = pow(10,i-1)*2 + 8*t[i-1];}while(scanf("%d",&n),n){vector<int>ans;int tmp = n;while(tmp){ans.push_back(tmp%10);tmp/=10;} int cnt=0; for(int i=ans.size()-1;i>0;i--){if(ans[i]){if(ans[i]>3&&ans[i]<8)ans[i]-=1,cnt+=pow(10,i);else if(ans[i]>7&&ans[i]<10)ans[i]-=2,cnt+=2*pow(10,i);cnt+=ans[i]*t[i];}}if(ans[0]){if(ans[0]>3&&ans[0]<8)cnt++;else if(ans[0]>8&&ans[0]<10)cnt+=2;}printf("%d: %d\n",n,n-cnt);}return 0; }總結
以上是生活随笔為你收集整理的HDU-4278 Faulty Odometer 数学递推 || 八进制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Matlab颜色对照(RGB三元组、十六
- 下一篇: 关于软件实施经验分享