uva 10474 Where is the Marble? 计数排序

2014-11-23 22:13:32 ? 作者: ? 浏览: 4

题目给出一系列数字,然后问哪个数字是从小到大排在第几的,重复出现算第一个。

数据范围为10000,不大,完全可以暴力,sort不会超时。

但是由于以前做比赛时也遇到这种题目,没注意看数据范围,然后暴力被hack了。之后就学会了计数排序了。

这题也用计数排序做,挺快的,代码也不长。

代码:

#include    
#include    
const int maxn = 10001;  
  
int num[maxn], s[maxn];  
  
int main() {  
    int n, q, tmp, m = 0, cnt = 0;  
    while (scanf("%d%d", &n, &q) && (n || q)) {  
        printf("CASE# %d:\n", ++cnt);  
        memset(num, 0, sizeof(num));        //init   
        memset(s, 0, sizeof(s));  
        for (int i = 1; i <= n; i++) {       //input   
            scanf("%d", &tmp);  
            if (m < tmp)  
                m = tmp;  
            num[tmp]++;  
        }  
        int sum = 0;  
        for (int i = 1; i <= m; i++)     //calc the sum   
            s[i] = s[i - 1] + num[i];  
        for (int i = 1; i <= q; i++) {       //output   
            scanf("%d", &tmp);  
            if (num[tmp])  
                printf("%d found at %d\n", tmp, s[tmp - 1] + 1);  
            else  
                printf("%d not found\n", tmp);  
        }  
    }  
    return 0;  
}  

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: