运用一个数学上的小技巧:

  1. 已知题目输入键值对的个数 n(1 <= n <= 500) 可以让输入的key乘上键值对的最大值然后加上索引值放到key数组里,输入的value放在value数组的对应索引里,遇到相同的key值就在对应位置上累加value,这样我们可以得到两个数组,相同的索引(数组下标)即是key对应的value
  2. 然后我们对key数组进行排序,因为索引值一定会小于等于输入键值对的个数,所以索引值并不会影响排序结果,仍会按照key的大小进行排序。
  3. 最后我们按照排序后的key数组进行输出,key[i]对键值对的最大值整除即可得到key值,取余得到索引即可在value数组中找到对应的value值。
#include<stdio.h>
#define MAX 500
#define long long size_t
int cmp(size_t *a, size_t *b){
    return (int)(*a - *b);
}
int main(){
    int num = 0, temp1 = 0, temp2 = 0, size = 0, flag = 0;
    scanf("%d\n",&num);
    size_t *key = malloc(num*sizeof(size_t));
    int *value = malloc(num*sizeof(int));
    memset(key,0,num*sizeof(size_t));
    for(int i=0; i<num; i++){
        flag = 1;
        scanf("%d %d\n",&temp1,&temp2);
        for(int a=0; a<size; a++){
             if(temp1 == key[a]/MAX){
                 value[a] += temp2;
                 flag = 0;
             }
        }
        if(flag){
            key[size] = (temp1*MAX)+size;
            value[size] = temp2;
            size++;
        }
    }
    qsort(key,size,sizeof(size_t),cmp);
    for(int j = 0; j<size; j++){
        printf("%d %d\n",key[j]/MAX,value[key[j]%MAX]);
    }
  return 0;
}

这种解法的缺陷就是输入的键值对个数太多会超出long long 的范围,只适用于数据量小的情况!

alt