思路

作为一个Java程序员,我拿到这道题以后的第一感觉就是用Map来保存,然后去计算排序输出。

Java有些内置的集合就可以完成这一点,比如TreeMap,这是一个有序的Map。因此可以用Java代码简单的写出这道题的解法。

Java版本

import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int a = scanner.nextInt();
            Map<Integer, Integer> map = new TreeMap<>();
            for (int i = 0; i < a; i++) {
                int key = scanner.nextInt();
                int value = scanner.nextInt();
                if (!map.containsKey(key)) {
                    map.put(key, value);
                } else {
                    map.put(key, value + map.get(key));
                }
            }

            map.forEach((k, v) -> System.out.println(k + " " + v));
        }
    }
}

然而最近在学C语言和C++语言,因此就不免要用C语言来写写这段代码。

C本身是没有Map这种容器的,因此可以自己实现一个字典表来处理。不过我想起来之前做的一道题,和这个有点类似,就是用数组去保存输入的数据。数组的下标其实就是一种key,输入的过程中,相同key的value值进行累加就可以了。

因此就有了这一段C语言代码。

C语言版本

#include <stdio.h>

#define SIZE 1000

int main(void)
{
    int n;
    scanf("%d", &n);
    int arr[SIZE]={0};
    int key, value;
    for (int i = 0; i < n; i++)
    {
        scanf("%d %d", &key, &value);
        arr[key] += value;
    }
    for (int j = 0; j < n; j++)
    {
        if (arr[j] == 0)
        {
            continue;
        }
        printf("%d %d\n", j, arr[j]);
    }
    return 0;
}

C语言的好处就是真的快,这段代码只用了3ms。