前綴和

所謂前綴和,可以簡單歸納成一條公式,即ans[ i ] = ans[ i - 1 ] + a[ i ];

如何理解,看例題:

 

Description

已知兩個正整數a和b,求在a與b之間(包含a和b)的所有整數的十進制表示中1出現的次數。

Input

多組數據(不超過100000組),每組數據2個整數a,b.(1≤a,b≤1000000).

Output

每組數據的答案佔一行。

Sample Input

1 10
10 100
2 1

Sample Output

2
20
1

【解析】

如果每次從a到b都用一個函數f(i)來找出i這個數包含幾個1再相加,那肯定是TLE的。

所以我們先預處理,一下每次都用函數求出數i包含1的個數,然後我們在開一個數組ans[],每次都是從1到i中1的個數的和,所以每次循環都是ans[ i ] = ans[ i - 1 ] + a[ i ];

詢問的時候直接ans[ b ] - ans[ a - 1 ]就是答案了。

#include<iostream>
using namespace std;

const int maxn = 1e6+10;
int ans[maxn];  

int f(int a)
{
    int cnt = 0;
    while(a)
    {
        if(a%10 == 1)   cnt++;
        a /= 10;
    }
    return cnt;
}


int main()
{
    ans[0] = 0; 
    for(int i=1; i<=1e6; i++)
        ans[i] = ans[i-1] + f(i); 

    int a,b;
    while(~scanf("%d%d",&a,&b))
    {
        if(a>b)
            swap(a,b)
        printf("%d\n",ans[b]-ans[a-1]);
    } 
    return 0;
}

 

發佈了89 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章