题目链接。
分析:
本题难点在于看不懂题(英语真的很重要)。
该题是输出小于n的special number的数量(quantity)。
暴力+二分。
AC代码如下:
#include <stdio.h> #include <string.h> #define MAXN 10000010 int q[MAXN]; unsigned char hash[11]; int main(){ int n, i, t, top=0, high, low, mid, pos; for(i=1; i<=MAXN; i++){ memset(hash, 0, sizeof(hash)); t = i; while(t){ if(!hash[t%10]){ hash[t%10] = 1; t /= 10; } else break; } if(t == 0) q[top++] = i; } while(scanf("%d", &n) == 1){ if(n<=1){printf("0\n"); continue;} high = top; low = 0; while(low<high){ mid = low + (high-low)/2; if(q[mid] == n){pos = mid; break;} if(q[mid]>n) {high = mid;} else{low = mid+1; pos = low;} } printf("%d\n", pos); } return 0; }
不过有个问题:
如果将代码改为
if(q[mid]>n) {high = mid; pos = mid;} else low = mid+1;
会报错,目前不清楚原因。也许是对二分的细节不太了解?回头研究下。