题目
分析
给你一堆有编号的大理石,按照编号排序后,问你某编号的大理石是第几个。
思路
- 可以尝试桶排序;
- 为了减少时间,可以标记桶的范围。
代码
#include <stdio.h>
#include <string.h>
int main(void)
{
int n, q, t, i, tmp, min, max;
int bucket[10005];
for (t = 1; scanf("%d%d", &n, &q) && n && q; t++) {
memset(bucket, 0, sizeof (bucket));
max = 0;
min = 0xffff;
for (i = 0; i < n; i++) {
scanf("%d", &tmp);
bucket[tmp]++;
max = max < tmp? tmp: max;
min = min > tmp? tmp: min;
}
for (i = min, tmp = 0; i <= max; i++) {
if (bucket[i]) {
tmp += bucket[i];
bucket[i] = tmp - bucket[i] + 1;
}
}
printf("CASE# %d:\n", t);
for (i = 0; i < q; i++) {
scanf("%d", &tmp);
if (bucket[tmp])
printf("%d found at %d\n", tmp, bucket[tmp]);
else
printf("%d not found\n", tmp);
}
}
return 0;
}