1. 程式人生 > >哈爾濱理工大學第七屆程式設計競賽決賽 D 數圈圈

哈爾濱理工大學第七屆程式設計競賽決賽 D 數圈圈

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
題目描述
tabris有一個習慣,無聊的時候就會數圈圈,無論數字還是字母。
現在tabris更無聊啦,晚上睡不著覺就開始數羊,從a只數到b只。
順便還數了a到b之間有多少個圈。

但是tabris笨啊,雖然數羊不會數錯,但很可能數錯圈的個數。
但是tabris很難接受自己笨這個事實,所以想問問你他一共應該數出多少個圈,這樣tabris才好判斷他到底笨不笨啊。
輸入描述:
輸入一個T,表示資料組數
每組測試資料包含兩個正整數a,b。
T∈[1,1000]
a,b∈[1,1014]
輸出描述:
每組資料輸出結果,並換行。
示例1
輸入

11
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
1 100
輸出

0
0
0
1
0
1
0
2
1
1
111
備註:
數字的圈的個數請根據樣例自行理解。

這題基本就是數位DP,沒有什麼難度。其實題目的意思就可以理解成:在a,b這個區間內0 4 6 8 9的出現的數量。所以只要DP出這些的數量也就完成了。

#include<bits/stdc++.h>
#define max(a,b) a>b?a:b
using namespace std ;
typedef long long ll;

int
main(){ int T; cin >> T; for(int i = 0 ; i < T ; i++){ ll a[2]; ll ans[2][10]; memset(ans,0,sizeof(ans)); cin>>a[0]>>a[1]; a[0]--; ll current,after,before; for(int i = 0 ; i < 2 ; i++){ if(a[i]>=0) for
(int j = 0 ; j <= 9 ; j++){ ll k = 1; while(a[i]/k){ current = (a[i]/k)%10; before = a[i]/(10*k); after = a[i]-a[i]/k*k; if(current > j) ans[i][j] += (before+1)*k; else if (current < j) ans[i][j] += before*k; else if (current == j) ans[i][j] += before*k+after+1; if(j == 0) ans[i][j]-=k; k*=10; } } } /* for(int j = 0 ; j <= 9 ; j++){ for(int i = 0 ; i <= 1; i++) cout<<ans[i][j]<<" "; cout<<endl; }*/ ll count = 0 ; count = ans[1][0]-ans[0][0]+ans[1][4]-ans[0][4]+ans[1][6]-ans[0][6]+2*(ans[1][8]-ans[0][8])+ans[1][9]-ans[0][9]; cout<<count<<endl; } }