邱老师选妹子
Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
邱老师长得帅这是人尽皆知,于是追他的妹子就会很多。
但是你知道,邱老师是一个很专一的人,所以他心里面只能有一个人。
于是他决定从追他的众多妹子里挑选一个出来。于是酱神给邱老师出来一个主意,已知有一些妹子,恰好可以给她们从l到r排号,使得每一个妹子有
单独的数字,而正好有r-l+1个妹子。
酱神说,我们不能要运气不好的女孩,而酱神又给了两个数字62和4,如果妹子的排号里面有62(必须是连续的)或4,那么就排除他现在给你l和r,问
有多少妹子可以有幸在第一轮留下。
Input
输入的都是整数对l、r(0<l≤r<1000000),如果遇到都是0的整数对,则输入结束。
Output
每组数据输出占一行,对于每个l和r 输出有多少个妹子可以在第一轮不被排除
Sample input and output
Sample Input | Sample Output |
---|---|
1 100 0 0 | 80 |
Hint
不好的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不好的。但是,61152虽然含有6和2,但不是62连号
Source
2015 UESTC Training for Dynamic Programming
My Solution
暴力法分分钟过,只是不知道为什么,这个是在dp专题,☺☺
暴力的话 10^6*6,不会超时的。
从 l 到 r 枚举,分别用函数处理每个i
如果 i %10 为4,ans--;return
如果为2,则i /=`10;在看看是6则ans--;return;否则递归下去
但递归出 i == 0,则递归结束
#include <iostream>
#include <cstdio>
using namespace std;
int ans;
void solve(int x)
{
if(x == 0) return;
if(x % 10 == 4) {ans--;return;}
else if(x % 10 == 2){ x /= 10;if(x %10 == 6) {ans--;return;} else solve(x);}
else solve(x/=10);
}
int main()
{
int l, r;
while(scanf("%d%d", &l, &r)){
if(l == 0 && r == 0) break;
ans = r-l+1;
for(int i = l; i <= r; i++){
solve(i);
}
printf("%d\n", ans);
}
return 0;
}
Thank you!