高校俱乐部第二届战神杯题解

来源:互联网 发布:怎么制作淘宝店铺招牌 编辑:程序博客网 时间:2024/05/05 05:54

Njzy学习了回文串后联想到了回文数,他希望统计出一个区间内的所有回文数。现在给定一个闭区间[a,b],求这个区间里有多少个回文数。比如[20,30],只有一个回文数那就是22.

 输入描述:   输入包含多组测试数据,每组测试数据包含两个整数a,b,(0<a<=b<10^6)。

输出描述:   对于每组测试数据输出相应的答案。

思路:水题。这个明显是水神杯...聪明的你,肯定不会暴力求解的....对吧?!太聪明的你,说不定还会当成线段树来拍...但是正常的你,应该会dp一下吧。

大概就是,一次遍历,考虑[0,i]的回文数个数,[l,r]的回文数就是[0,r]-[0,l-1]最后每次查找就是O(1),输出ans[m]-ans[n-1],与CF的前次很像的做法,我当时用了线段树!

dp方程就是 dp[i]=dp[i-1]+symm(i)。


/***********************************************************> OS     : Linux 3.2.0-60-generic #91-Ubuntu> Author : yaolong> Mail   : dengyaolong@yeah.net > Time   : 2014年06月03日 星期二 17:53:49 **********************************************************/#include<iostream>#include<cstdio>#include<string>#include<cstring>using namespace std;int ans[1000001];bool symm(int m){int temp = m,n=0;while (temp){n = n*10+temp%10;temp = temp/10;}return (m == n);}int main(){    ans[0]=0;    for(int i=1;i<=1000000;i++){        if(symm(i)){            ans[i]=ans[i-1]+1;        }else{            ans[i]=ans[i-1];        }    }    int n,m;    while(cin>>n>>m){        cout<<ans[m]-ans[n-1]<<endl;    }}



3 0
原创粉丝点击