NYOJ975 关于521

2014-11-24 11:34:39 · 作者: · 浏览: 0

原题链接

开始总以为这题和排列组合有关,然后想了两节课也理不出思路,后来看到会长的这个方法,果断采用了。
感觉题目叙述的略坑。

794046 长木 关于521 \Accepted 116 8044 C/C++ 04-03 08:23:16

 
#include 
  
   
#include 
   
     #define MAX 1000000 + 2 int anger[MAX], anger2[MAX]; char str[10]; void intToString(int n){ int i = 0, t; while(n){ str[i++] = n % 10 + '0'; n /= 10; } str[i] = '\0'; //注意是倒置的 } int strCmp(){ if(strstr(str, "125")) return 2; if(strchr(str, '1') && strchr(str, '2' ) && strchr(str, '5')) return 1; return 0; } int main(){ int i, j = 1, t; for(i = 125; i != MAX; ++i){ intToString(i); t = strCmp(); switch(t){ case 1: anger[i] = anger[i - 1] + 1; anger2[i] = anger2[i - 1]; break; case 2: anger[i] = anger[i - 1] + 1; anger2[i] = anger2[i - 1] + 1; break; default : anger[i] = anger[i - 1]; anger2[i] = anger2[i - 1]; break; } } while(scanf("%d%d", &i, &t) == 2) printf("Case %d:%d %d\n", j++, anger[t] - anger[i - 1], anger2[t] - anger2[i - 1]); return 0; }