
题目描述数据表记录包含表索引index和数值value请对表索引相同的记录进行合并即将相同索引的数值进行求和运算输出按照index值升序进行输出。输入描述先输入键值对的个数n然后输入成对的index和value值用空格隔开。1 ≤ n ≤ 5000 ≤ index ≤ 111111111 ≤ value ≤ 100000输出描述输出合并后的键值对多行格式为index value按index升序排列。示例输入text4 0 1 0 2 1 3 3 4输出text0 3 1 3 3 4说明索引 0 出现两次值 1 2 3其余索引只出现一次。C 语言解决方案思路由于index最大可达11111111约一千万直接用数组当桶会超内存1000 万 × 4 字节 ≈ 40MB勉强但偏大。更稳妥的做法用一个结构体数组存放(index, value)。按index排序。遍历排序后的数组相邻相同index的值累加后输出。这里使用qsort排序。代码实现c#include stdio.h #include stdlib.h typedef struct { int index; int value; } Record; // qsort 的比较函数按 index 升序 int cmp(const void *a, const void *b) { Record *ra (Record *)a; Record *rb (Record *)b; if (ra-index ! rb-index) { return ra-index - rb-index; } return 0; } int main(void) { int n; scanf(%d, n); Record recs[505]; for (int i 0; i n; i) { scanf(%d %d, recs[i].index, recs[i].value); } // 按 index 升序排序 qsort(recs, n, sizeof(Record), cmp); // 遍历合并相邻相同 index 的记录 for (int i 0; i n; ) { int idx recs[i].index; int sum 0; int j i; // 累加所有相同 index 的 value while (j n recs[j].index idx) { sum recs[j].value; j; } printf(%d %d\n, idx, sum); i j; // 跳过已处理的记录 } return 0; }代码说明步骤说明结构体Record把 index 和 value 绑定在一起便于整体排序qsortcmp按 index 升序排序为后续合并做准备内层while遇到相同 index 就累加天然完成合并i j跳过已处理的所有相同 index 记录复杂度分析时间复杂度O(n log n)主要是排序的开销合并遍历为 O(n)。空间复杂度O(n)存储记录数组。测试用例输入输出40 10 21 33 40 31 33 435 105 205 305 602100 11 21 2100 1