首页 > 试题广场 >

合并表记录

[编程题]合并表记录
  • 热度指数:802593 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}数据表中,一条记录包含表索引和数值两个值。请对表索引相同的记录进行合并(即将相同索引的数值进行求和运算),随后按照索引值的大小从小到大依次输出。

输入描述:
\hspace{15pt}第一行输入一个整数 n\left(1 \leqq n \leqq 500\right) 代表数据表的记录数。
\hspace{15pt}此后 n 行,第 i 行输入两个整数 x_i, y_i\left(0 \leqq x_i \leqq 11\,111\,111;\ 1 \leqq y_i \leqq 10^5\right) 代表数据表的第 i 条记录的索引和数值。


输出描述:
\hspace{15pt}一共若干行(视输入数据变化),第 i 行输出两个整数,代表合并后数据表中第 i 条记录的索引和数值。
示例1

输入

4
0 1
0 2
1 2
3 4

输出

0 3
1 2
3 4

说明

\hspace{15pt}在这个样例中,第 1,2 条记录索引相同,合并数值为 1 + 2 = 3
示例2

输入

2
0 1
0 1

输出

0 2
C
gk1头像 gk1
#include<stdio.h>
#include<stdlib.h>
longintstr[12000000]={0};
longintsum[12000000]={0};
intmain()
{
    intn,big=0;
    longinta,b,i;
     
    while(~scanf("%d",&n))
    {
        for(i=0;i<n;i++)
        {
            scanf("%ld %ld",&a,&b);
            str[a]+=b;//数值加
            sum[a]=1;//a位置标记
            if(a>=big)
            big=a;
        }              
         
            for(i=0;i<=big;i++) 
            {
                if(sum[i]==1)
                printf("%ld %ld\n",i,str[i]);
            }      
             
    }
    return0;
}

纯c代码,简单大数组思路,能通过
发表于 2025-06-19 14:57:46 回复(0)
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int num;
    scanf("%d", &num);
    
    //分配空间,输入数据 
    int *idx, *value;
    idx = (int*)malloc(sizeof(int)*num);
    value = (int*)malloc(sizeof(int)*num);
    for(int i=0; i<num; i++)
    { 
        scanf("%d %d", &idx[i], &value[i]);
    }
    
    //依据数组第一列进行冒泡排序
    for(int i=0; i<num-1; i++)
    {
        for(int j=i+1; j<num; j++)
        {
            if(idx[i] > idx[j])
            {
                int tmp;
                tmp = idx[i];
                idx[i] = idx[j];
                idx[j] = tmp;
                
                tmp = value[i];
                value[i] = value[j];
                value[j] = tmp;
            }            
        }
    }
    
    //合并相同索引数值
    for(int i=0; i<num; i++) 
    {
        for(int j=i+1; j<num; j++)
        {
            if(idx[i] == idx[j])
            {
                value[i] += value[j];
                value[j] = 0;            
                //value[j] = 0 巧妙设计,作为flag使用,打印时不要打印0
                //但注意,若是相加的数也为0,则会漏打印,但此题 yi>=1 
                //若 yi >=0,则需一个flag[num],元素均为1 ,相同索引保留一个 flag[i]=1,其他赋值 0 
            }
            else
            {
                i = j;    //更新 i 值,实现跳转
            }
            
            //加速跳出 
            if(j == num-1)     
                i = j;
        }
    }
    
    
    for(int i=0; i<num; i++)
    {
        if(value[i] != 0)
            printf("%d %d\n", idx[i], value[i]);
    }
    
    free(idx);
    free(value);
    return 0;
 } 
发表于 2025-06-19 11:29:02 回复(0)
//为什么第五个用例过不了,我用本地ide跑出来都是对的,求大佬解疑~
#include <stdio.h>
#include <string.h>

//冒牌排序两个等长数组,str1为排序依据,str2跟着str1一块变
void BubbleSort(int str1[], int str2[],int len)
{
    int temp=0;
    for(int i=0;i<len-1;i++)
    {
        for(int j=0;j<len-i-1;j++)
        {
            if(str1[j]>str1[j+1])
            {
                temp=str1[j];
                str1[j]=str1[j+1];
                str1[j+1]=temp;
                temp=str2[j];
                str2[j]=str2[j+1];
                str2[j+1]=temp;
            }
        }
    }
}

int main() {
    int temp1=0;//临时保存输入的数据
    int temp2=0;
    int flag=0;//标志是否在str中找到相同数字
    int count=0;//用来接入第一行数值
    int len=0;//代表目前数组的长度
    scanf("%d",&count);
    int str[500];
    int nums[500];
    for(int i=0;i<count;i++)//循环传入
    {
        flag=0;
        scanf("%d",&temp1);
        scanf("%d",&temp2);
        for(int j=0;j<i;j++)
        {
            if(str[j]==temp1)
            {
                flag=1;//表示前面出现过目前的tepm1
                nums[j]+=temp2;//在之前的基础上加上temp2
                break;
            }

        }
        if (flag==0)//代表目前的temp1前面未出现过,就传入新的数据进去
        {
            str[len]=temp1;
            nums[len]=temp2;
            len++;//数组长度增加
        }

    }
    //排序
    BubbleSort(str,nums,len);
    for(int i=0;i<len;i++)
    {
        printf("%d %d\n",str[i],nums[i]);
    }

    return 0;
}
发表于 2025-04-04 21:21:09 回复(0)
#include <stdio.h>
int main() {
    int n;
    int *x,*y;
    scanf("%d",&n);
    x=(int *)malloc(n*sizeof(int));
    y=(int *)malloc(n*sizeof(int));
    for(int k=0;k<n;k++){
        scanf("%d %d",&x[k],&y[k]);
    }
    for(int i=0;i<n;i++){
        for(int j=i+1;j<n;j++){
            if(x[i]==x[j]){              //x[i]=x[j]时,索引相同,合并数值
                y[i]+=y[j];
                y[j]=0;
            }
            else if(x[i]>x[j]){          //x[i]比x[j]大时,交换x[i]与x[j]并交换对应的y[i]与y[j],相当于排序
                int t;
                t=x[i];
                x[i]=x[j];
                x[j]=t;
                t=y[i];
                y[i]=y[j];
                y[j]=t;
            }
        }
    }
    for(int i=0;i<n;i++){
        if(y[i]!=0) printf("%d %d\n",x[i],y[i]);
    }
    free(x);
    free(y);
    return 0;
}

发表于 2025-02-15 11:08:12 回复(0)
#include <stdio.h>
#include <stdlib.h>

typedef struct indexValue
{
    int index;
    int value;
}indexvalue;

void swap(indexvalue *a,indexvalue *b)
{
    indexvalue tempdata;
    tempdata=*a;
    *a=*b;
    *b=tempdata;
}

void quickSort(indexvalue *nums,int begin,int end)
{
    int left,right,keypos;

    if(begin>=end)
        return;
    left=begin;
    right=end;
    keypos=begin;

    while(left<right)
    {
        while((nums[right].index) >= (nums[keypos].index) && right>left)
        {
            right--;
        }
        while((nums[left].index) <= (nums[keypos].index) && right>left)
        {
            left++;
        }
        if(left<right)
            swap(&nums[right],&nums[left]);
    }

    swap(&nums[keypos],&nums[left]);
    keypos=left;

    quickSort(nums, begin, keypos-1);
    quickSort(nums, keypos+1, end);
}

int main() {
    int nums,i;
    indexvalue *indval;
   
    scanf("%d",&nums);
    indval=(indexvalue *)malloc(sizeof(indexvalue)*nums);

    for(i=0;i<nums;i++)
    {
        scanf("%d %d",&((indval+i)->index),&((indval+i)->value));
    }

    quickSort(indval,0,nums-1);

    for(i=1;i<nums;i++)
    {
        if(indval[i].index == indval[i-1].index)
        {
            indval[i].value = indval[i].value + indval[i-1].value;
            indval[i-1].index =0;
            indval[i-1].value =0;
        }
    }

    for(i=0;i<nums;i++)
    {
        if(indval[i].value)
            printf("%d %d\r\n",indval[i].index,indval[i].value);
    }
}
发表于 2024-12-05 21:43:45 回复(0)
#include <stdio.h>
#include <stdlib.h>

int comper(const void *a,const void *b){
    int *pairA = (int *)a;
    int *pairB = (int *)b;
    return pairA[0] - pairB[0];
}

int main() {
    int n;
    scanf("%d",&n);

    int data[n][2];

    for(int i = 0; i < n; i++){
        scanf("%d %d", &data[i][0], &data[i][1]);
    }

    qsort(data, n, sizeof(data[0]),comper);

    for(int i=0;i<n; i++){
        while(i< n-1 && data[i][0] == data[i+1][0] ){
            data[i+1][1] += data[i][1];
            i++;

        }
        printf("%d %d\n",data[i][0], data[i][1]);
    }
   
    return 0;
}
发表于 2024-10-09 13:07:21 回复(0)
#include <stdio.h>

void Ascend(int num, int index[], int value[]);
void sum_index(int num, int index[], int value[], int index1[], int value1[]);

int main() {
    int num;
    scanf("%d", &num);

    int index[num], value[num];
    for (int i = 0; i < num; i++) {
        scanf("%d %d", &index[i], &value[i]);
    }

    // 按照 index 数组进行升序排序
    Ascend(num, index, value);

    int index1[num], value1[num];
    // 调用 sum_index 函数进行合并
    sum_index(num, index, value, index1, value1);

    return 0;
}

// 按 index 数组进行升序排序
void Ascend(int num, int index[], int value[]) {
    for (int i = 0; i < num - 1; i++) {
        for (int j = 0; j < num - 1 - i; j++) {
            if (index[j] > index[j + 1]) {
                // 交换 index
                int t = index[j];
                index[j] = index[j + 1];
                index[j + 1] = t;

                // 同步交换 value
                t = value[j];
                value[j] = value[j + 1];
                value[j + 1] = t;
            }
        }
    }
}

// 合并 index 数组中的相同元素,并将对应的 value 累加
void sum_index(int num, int index[], int value[], int index1[], int value1[]) {
    int j = 0; // 新数组的索引

    // 初始化第一个元素
    index1[j] = index[0];
    value1[j] = value[0];

    for (int i = 1; i < num; i++) {
        if (index[i] == index[i - 1]) {
            // 累加相同 index 的 value
            value1[j] += value[i];
        } else {
            // 如果 index 不同,存储新的元素
            j++;
            index1[j] = index[i];
            value1[j] = value[i];
        }
    }

    // 输出合并后的数组
    for (int i = 0; i <= j; i++) {  // 输出所有合并后的值,i <= j
        printf("%d %d\n", index1[i], value1[i]);
    }
}
发表于 2024-09-09 16:19:59 回复(0)
#include <stdio.h>

int main(){
    int n ,index  ,value;
    int i ,j;
    int a[500][2];
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d %d",&a[i][0],&a[i][1]);
    }
   for(i=n-1;i>0;i--){
        for(j=i-1;j>=0;j--){
            if(a[i][0]==a[j][0]){
                a[j][1]=a[i][1]+a[j][1];
                a[i][1]=0;
            }
        }
    }
    for(i=n-1;i>0;i--){
        for(j=i-1;j>=0;j--){
            if(a[i][0]<a[j][0]){
               
                index=a[i][0];
                a[i][0]=a[j][0];
                a[j][0]=index;

                value=a[i][1];
                a[i][1]=a[j][1];
                a[j][1]=value;
               
            }

            }
        }
    for(i=0;i<n;i++) {
        if (a[i][1]!=0){
            printf("%d %d\n",a[i][0],a[i][1]);
        }
    }
   
        return 0;

    }
发表于 2024-08-29 19:33:27 回复(0)
#include <stdio.h>
struct data {
    int index;
    int value;
};

void shownum(struct data arr[], int len) {
    for (int i = 0; i < len; i++) {
        printf("%d %d\n", arr[i].index, arr[i].value);

    }
}
int main() {
    struct data arr[1000];
    struct data res[1000];
    int n;
    /*int k=0;*/
    scanf("%d", &n);
    int res_len = 0;
    for (int i = 0; i < n; i++) {
        scanf("%d %d", &(arr[i].index), &(arr[i].value));
    }
    for (int i = 0; i < n-1; i++) {
        for (int j = i + 1; j < n; j++) {
            if ((arr[i].index == arr[j].index) && (arr[i].index >= 0)) {
                arr[i].value += arr[j].value;
                arr[j].index = -1;
                /*k++;*/
            }
        }
    }

    for (int i = 0; i < n; i++) {
        if (arr[i].index >= 0) {
            res[res_len].index = arr[i].index;
            res[res_len].value = arr[i].value;
            res_len++;
        }
    }
    for (int i = 0; i < res_len - 1; i++) {
        for (int j = 0; j < res_len - i - 1; j++) {
            if (res[j].index > res[j + 1].index) {
                int temp = res[j].index;
                res[j].index = res[j + 1].index;
                res[j + 1].index = temp;

                int score = res[j].value;
                res[j].value = res[j + 1].value;
                res[j + 1].value = score;
            }
        }
    }
    shownum(res, res_len);
    return 0;
}
发表于 2024-08-03 16:23:19 回复(0)
int main() {
    int n,b,j=0;
    scanf("%d",&n);
    int a[n][2];
    int temp[n][2];
    memset(a, 0, sizeof(a));
    memset(temp, 0, sizeof(temp));
    int i=0,k=0,inx,val;
    for(;k<n;k++){
        scanf("%d %d",&inx,&val);
        if(inx>=n){
            temp[n-1][0]=inx;
            temp[n-1][1]+=val;
        }
        else{
            temp[inx][0]=inx;
            temp[inx][1]+=val;
        }
    }
    for(;j<n;j++){
        if(temp[j][0]==temp[j][1]&&temp[j][0]==0){}
        else{printf("%d %d\r\n",temp[j][0],temp[j][1]);}
    }
}

发表于 2024-07-23 17:09:12 回复(0)
#include <stdio.h>
int main() {
    int n;   //表示键值对的个数
    scanf("%d", &n);
    int arr[n][2];   //建立数组
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 2 ; j++) {
            scanf("%d", &arr[i][j]);
        }
    }
  //将重复的相加,重复的索引设置为-1
    int k = 0;
    int i, j, q, p;
    for (i = 0 ; i < n - 1; i++) {
        for ( j = i + 1; j < n; j++) {
            if ((arr[i][0] == arr[j][0]) && arr[i][0] >= 0) {
                arr[i][1] = arr[j][1] + arr[i][1];
                arr[j][0] = -1;
                k++;
            }
        }
    }
//将筛选后的数组放入一个新数组
   int m = n - k;
    int arr1[m][2];
    int g = -1;
    for (int i = 0; i < n; i++) {
        if (arr[i][0] >= 0) {
            g++;
            arr1[g][0] = arr[i][0];
            arr1[g][1] = arr[i][1];
        }
    }
  //冒泡排序
        for (int q = 0; q < m - 1; q++) {
            for (int h = 0; h < m - q - 1; h++) {
                if (arr1[h][0] > arr1[h + 1][0]) {
                    int k = arr1[h][0];
                    int f = arr1[h][1];
                    arr1[h][0] = arr1[h + 1][0];
                    arr1[h][1] = arr1[h + 1][1];
                    arr1[h + 1][0] = k;
                    arr1[h + 1][1] = f;
                }
            }
        }
       
    for (int q = 0; q < m; q++) {
        printf("%d %d\n", arr1[q][0], arr1[q][1]);
    }
    return 0;
}


发表于 2024-07-18 17:56:24 回复(0)
#include <stdio.h>
struct Book {
    int index;
    int value;
};
//结构体升序排列
void B_sort(struct Book* nums, int numsSize) {
    int flag = 1;
    int tempindex;
    int tempvalue;
    for (int i = 0; i < numsSize - 1; i++) {
        for (int j = numsSize - 1; j > i; j--) {
            if (nums[j].index < nums[j - 1].index) {
                tempindex = nums[j - 1].index;
                tempvalue = nums[j - 1].value;
                nums[j - 1].index = nums[j].index;
                nums[j - 1].value = nums[j].value;
                nums[j].index = tempindex;
                nums[j].value = tempvalue;
                flag = 0;
            }

        }
        if (flag==1) {
            break;
        }
    }
}
int main() {
    int n;
    scanf("%d", &n);
    struct Book arr[n];
    int i = 0;
    while (i < n) {
        scanf("%d %d", &arr[i].index, &arr[i].value);
        i++;
    }
    //排序
    B_sort(arr, n);
    //从小到大排序在开始
    for (i = 0; i < n - 1; i++) {
        if (arr[i].index == arr[i + 1].index) {
            arr[i].value = arr[i].value + arr[i + 1].value;
            for (int j = i + 1; j < n - 1; j++) {
                arr[j].index = arr[j + 1].index;
                arr[j].value = arr[j + 1].value;
            }
            n = n - 1;
            //防止多个重复
            i=i-1;
        }

    }
    for (int k = 0; k < n; k++) {
        printf("%d %d\n", arr[k].index, arr[k].value);
    }
    return 0;
}
发表于 2024-07-04 20:10:36 回复(0)
#define _CRT_SECURE_NO_WARNINGS
#include <stdint.h>
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>


#define HASHMAP_CAPACITY 10

typedef int KeyType;
typedef int ValueType;

typedef struct node_s {
    int key;
    int val;
    struct node_s* next;
} KeyValueNode;

typedef struct {
    KeyValueNode* buckets[HASHMAP_CAPACITY];
    uint32_t hash_seed;
} HashMap;

int tmp[500] = { 0 };//用于存储哈希表结点的key值
int count = 0; //用于对哈希表结点计数

//哈希函数
static uint32_t hash(const void* key, int len, uint32_t seed) {
    const uint32_t m = 0x5bd1e995;
    const int r = 24;
    uint32_t h = seed ^ len;
    const unsigned char* data = (const unsigned char*)key;

    while (len >= 4) {
        uint32_t k = *(uint32_t*)data;
        k *= m;
        k ^= k >> r;
        k *= m;
        h *= m;
        h ^= k;
        data += 4;
        len -= 4;
    }

    switch (len) {
        case 3:
            h ^= data[2] << 16;
        case 2:
            h ^= data[1] << 8;
        case 1:
            h ^= data[0];
            h *= m;
    };

    h ^= h >> 13;
    h *= m;
    h ^= h >> 15;

    return h;
}
//创建哈希表
HashMap* hashmap_create() {
    HashMap* map = calloc(1, sizeof(HashMap));
    if (map == NULL) {
        printf("error: calloc failed in hashmap_create.\n");
        exit(-1);
    }
    map->hash_seed = time(NULL);
    return map;
}
//销毁哈希表
void hashmap_destroy(HashMap* map) {
    for (size_t i = 0; i < HASHMAP_CAPACITY; i++) {
        KeyValueNode* curr = map->buckets[i];
        while (curr != NULL) {
            KeyValueNode* tmp = curr->next;
            free(curr);
            curr = tmp;
        }
    }
    free(map);
}
//插入一个键值对
ValueType hashmap_put(HashMap* map, int key, int val) {
    char key_str[sizeof(int)];
    memcpy(key_str, &key, sizeof(int));
    int idx = hash(key_str, sizeof(int), map->hash_seed) % HASHMAP_CAPACITY;

    KeyValueNode* curr = map->buckets[idx];
    while (curr != NULL) {
        if (curr->key == key) {
            int old_val = curr->val;
            curr->val = old_val + val;
            return old_val;
        }
        curr = curr->next;
    }

    KeyValueNode* new_node = malloc(sizeof(KeyValueNode));
    if (new_node == NULL) {
        printf("Error: malloc failed in hashmap_put.\n");
        exit(1);
    }
    new_node->key = key;
    new_node->val = val;

    new_node->next = map->buckets[idx];
    map->buckets[idx] = new_node;

    return 0;
}

// 查询一个键值对
ValueType hashmap_get(HashMap* map, KeyType key) {
    char key_str[sizeof(int)];
    memcpy(key_str, &key, sizeof(int));
    int idx = hash(key_str, sizeof(int), map->hash_seed) % HASHMAP_CAPACITY;

    KeyValueNode* curr = map->buckets[idx];
    while (curr != NULL) {
        if (curr->key == key) {
            return curr->val;
        }
        curr = curr->next;
    }
    return 0; // 若不存在则返回0
}

// 快速排序的分区函数
static int partition(int arr[], int left, int right) {
    int pivot = arr[left];
    int low = left, high = right;

    while (low < high) {
        while (low < high && arr[high] >= pivot) {
            high--;
        }
        arr[low] = arr[high];
        while (low < high && arr[low] < pivot) {
            low++;
        }
        arr[high] = arr[low];
    }
    arr[low] = pivot;
    return low;
}

// 递归函数
void quick_sort_recursive(int arr[], int left, int right) {
    if (left < right) {
        int pivot_index = partition(arr, left, right);
        quick_sort_recursive(arr, left, pivot_index - 1);
        quick_sort_recursive(arr, pivot_index + 1, right);
    }
}

// 快速排序
void quick_sort(int arr[], int len) {
    quick_sort_recursive(arr, 0, len - 1);
}

int main(void) {
    HashMap* map = hashmap_create();
    if (map == NULL) {
        printf("哈希表创建失败。\n");
        return 1;
    }

    int sum;
    scanf("%d", &sum);
    int key[500] = { 0 }, value[500] = { 0 };
    for (int i = 0; i < sum; i++) {
        scanf("%d %d", &key[i], &value[i]);
    }

    for (int i = 0; i < sum; i++) {
        hashmap_put(map, key[i], value[i]);
    }

    for (int i = 0; i < HASHMAP_CAPACITY; i++) {
        KeyValueNode* curr = map->buckets[i];
        while (curr != NULL) {
            tmp[count++] = curr->key;
            curr = curr->next;
        }
    }

    quick_sort(tmp, count);
    for (int i = 0; i < count; i++) {
        printf("%d %d\n", tmp[i], hashmap_get(map, tmp[i]));
    }

    hashmap_destroy(map);
    return 0;
}

发表于 2024-06-23 22:24:28 回复(1)
定义大数组得在主函数外定义 学到了
发表于 2024-05-25 10:25:24 回复(0)
//花了大概两天debug,一言难尽。注释如下。
#define CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//功能:打印二维数组
void print_2D_array(int kv[][2], int rows) {
    int i = 0;
    for (i = 0; i < rows; i++) {
        printf("%d %d\n", kv[i][0], kv[i][1]);
    }
}

/*
 * @brief:删除二维数组里第二列是0的行。
 * @note:行数肯定会减少,所以要使用指针更新原rows。
*/
void proc_del_zero(int kv[][2], int* rows) {
    int i = 0, new_rows = 0;
    for (i = 0; i < *rows; i++) {
        if (kv[i][1] != 0) {
            kv[new_rows][1] = kv[i][1];
            kv[new_rows][0] = kv[i][0];
            new_rows++;
        }
    }
    *rows = new_rows;
}

/*
 * @brief:将相同索引的数值进行求和运算
 * @param:**kv:待处理的二维数组
 * @param:rows:待处理的二维数组的行数,也是键值对的个数
 * @retval:NONE
 * @note:第0列是key,第1列是value。
*/
void proc_sum(int kv[][2], int rows) {
    int i = 0, j = 0;
    for (i = 0; i < rows; i++) {
        for (j = i + 1; j < rows; j++) {
            if (kv[i][0] == kv[j][0]) {
                kv[i][1] += kv[j][1]; //求和
                kv[j][1] = 0; //被加过的元素置零,防止多次被加。
            }
        }
    }
}

/*
 * @brief:按照key值升序排列二维数组
 * @param:kv[][2]:待处理的二维数组
 * @param:rows:待处理的二维数组的行数,也是键值对的个数
 * @retval:NONE
 * @note:第0列是key,第1列是value。本次使用选择排序算法。
*/
void proc_upsort(int kv[][2], int rows) {
    // 检查数组是否有元素
    if (rows <= 0) return;

    int i = 0, j = 0;
    int min = 0;
    int temp[1][2] = {0};
    for (i = 0; i < rows; i++) {
        min = i;
        for (j = i + 1; j < rows; j++) {
            if (kv[min][0] > kv[j][0]) {
                min = j; //拿到最小key值对应的行数字
            }
        }

        //交换kv[i]行的数据和kv[min]行的数据
        temp[0][0] = kv[i][0];
        temp[0][1] = kv[i][1];
        kv[i][0] = kv[min][0];
        kv[i][1] = kv[min][1];
        kv[min][0] = temp[0][0];
        kv[min][1] = temp[0][1];
    }
}



int main() {
    int couples = 0; //键值对的个数,也是二维数组的行数。
    int key_value[501][2] = {0}; //根据题目,做多500行2列,第一列键,第二列值。
    int i = 0;
    scanf("%d", &couples);

    if (couples < 1 || couples > 500) //键值对的个数必须1 <= n <= 500
        exit(-1);

    for (i = 0; i < couples; i++) { //循环输入键值对
        scanf("%d %d", &key_value[i][0], &key_value[i][1]);

        if (key_value[i][0] < 0 || key_value[i][0] > 11111111)
            exit(-1); //必须 0 <= index <= 11111111

        if (key_value[i][1] < 1 || key_value[i][1] > 100000)
            exit(-1); //必须 1 <= value <= 100000
    }

    proc_sum(key_value, couples);      //键相同的行,对值求和,求完和的行把其value清零。
    proc_del_zero(key_value, &couples); //删除二维数组里第二列是0的行
    proc_upsort(key_value, couples);    //做完前面的步骤后,把每一行按照key的值升序
    print_2D_array(key_value, couples); //打印二维数组

    return 0;
}


发表于 2024-04-14 21:56:50 回复(1)
#include "stdio.h"
#include "string.h"
#include <ctype.h>
//思路:分成三个部分,求和,排序,输出。注意测试用例里给的数据是乱序所以必须排序。
//这个代码有一个问题,就是循环相加的部分只能处理index只有两个相同的部分,三个及以上就会漏,不知道怎么回事和怎么补救,还好例子里最多三个,因此用了两遍就过了。
void upper_bubble_sort_for_IA(int index[], int value[],int n)
{
    int i,j,tempv,tempi;
    for(i = 0; i <n; i++)
    {
        for(j = 0; j < n - 1- i; j++)
        {
            if(index[j] > index[j+1])
            {
                tempv = value[j];
                value[j] = value[j+1];
                value[j+1] = tempv;
                tempi = index[j];
                index[j] = index[j+1];
                index[j+1] = tempi;
            }
        }
    }
}
int main()
{
    //输入部分
    int n,i,a;
    //struct IA inva;
    scanf("%d",&n);
    int index[500] = {0},value[500] = {0};
    for(i = 0; i < n; i++)
    {
        scanf("%d",&index[i]);
        scanf(" %d", &value[i]);
    }
    //比较并求和部分
    
        for (i = 0; i < n; i++) 
        {
            for(a = 1; a < n - 1 -i; a++)
            {
                if(index[i] == index[i+a]&& value[i+a] !=0)
                {
                    value[i] = value[i] + value[i+a];
                    value[i+a] = 0;
                }
            }
        }
    
    //排序
    upper_bubble_sort_for_IA(index,value,n);
    for (i = 0; i < n; i++) 
        {
            for(a = 1; a < n -i; a++)
            {
                if(index[i] == index[i+a]&& value[i+a] !=0)
                {
                    value[i] = value[i] + value[i+a];
                    value[i+a] = 0;
                    //a = 1;
                    //i = 0;
                }
            }
        }
    //输出
    for(i = 0; i < n; i++)
    {
        if (value[i] !=0) 
        {
            printf("%d %d\n",index[i],value[i]);
        }
    }
}

编辑于 2024-03-29 01:14:25 回复(0)
#include <stdio.h>
int main() {
    int n, index, value; int count = 0;/*count表示被合并的表项数*/
    scanf("%d", &n);
    int Index[500];
    for (int i = 0; i < 500; i++)
        Index[i] = -1;
    int Value[500] = { 0 };
    for (int i = 0; i<n; i++)
    {
        scanf("%d %d", &index, &value);
        int tag = 0;
        for (int j = i-1; j >= 0; j--)
            if (Index[j] == index)
            {
                Value[j] += value;
                tag = 1;
                count++;
                break;
            }
        if (tag == 0)
            {
                Index[i] = index;
                Value[i] = value;
            }

       
    }
    n = n - count;
    int Indexcopy[500];/*直接使用Index数组也能得到题目要求的答案,这里复制一份是为了保留原来的结果*/
    for(int i = 0; i < 500; i++)
        Indexcopy[i] = Index[i];
    for (int k = 0; k < n; k++)
    {
        int minIndex = 11111111; int t;/*t表示indexcopy数组中最小值所在的数组元素的下标*/
        for (int a = 0; a < 500; a++)
            if (Indexcopy[a] != -1 && minIndex>=Indexcopy[a])
            {
                minIndex = Indexcopy[a];
                t = a;
            }
        Indexcopy[t] = -1;
        printf("%d %d\n", Index[t], Value[t]);
    }
    return 0;
}
发表于 2024-03-08 22:34:19 回复(0)