描述
数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
输入描述:
先输入键值对的个数n(1 <= n <= 500)
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1
输入:
4 0 1 0 2 1 2 3 4
输出:
0 3 1 2 3 4
示例2
输入:
3 0 1 0 2 8 9
输出:
0 3 8 9
解法一(选择排序):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int i,j,n,s,t,u,tmp1,tmp2;
int a[501][5];
int b[501][5];
while(cin>>n){
memset(a,0,sizeof(a));
s=0;
for(i=0;i<n;i++){
scanf("%d %d",&tmp1,&tmp2);
t=0;
for(j=0;j<s;j++){
if(a[j][0]==tmp1){
a[j][1]=a[j][1]+tmp2;
t=1;
break;
}
}
if(t==0){
a[s][0]=tmp1;
a[s++][1]=tmp2;
}
}
for(i=0;i<s;i++){
t=a[i][0];
u=a[i][1];
for(j=i+1;j<s;j++){
if(a[j][0]<t){
t=a[j][0];
a[j][0]=a[i][0];
a[i][0]=t;
u=a[j][1];
a[j][1]=a[i][1];
a[i][1]=u;
}
}
}
for(i=0;i<s;i++){
printf("%d %d\n",a[i][0],a[i][1]);
}
}
return 0;
}
解法二(快速排序):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
void swap(int (*a)[5], int x, int y){
int tmp1=a[y][0];
int tmp2=a[y][1];
a[y][0]=a[x][0];
a[y][1]=a[x][1];
a[x][0]=tmp1;
a[x][1]=tmp2;
}
void sort(int (*a)[5],int left, int right){
if(left>=right){
return ;
}
int i=left;
int j=right;
int key=a[left][0];
while(i<j){
while(i<j&&key<a[j][0]){
j--;
}
swap(a,i,j);
while(i<j&&key>=a[i][0]){
i++;
}
swap(a,i,j);
}
sort(a,left,i-1);
sort(a,i+1,right);
}
int main(){
int i,j,n,s,t,u,tmp1,tmp2;
int a[501][5];
int b[501][5];
while(cin>>n){
memset(a,0,sizeof(a));
s=0;
for(i=0;i<n;i++){
scanf("%d %d",&tmp1,&tmp2);
t=0;
for(j=0;j<s;j++){
if(a[j][0]==tmp1){
a[j][1]=a[j][1]+tmp2;
t=1;
break;
}
}
if(t==0){
a[s][0]=tmp1;
a[s++][1]=tmp2;
}
}
sort(a,0,s-1);
for(i=0;i<s;i++){
printf("%d %d\n",a[i][0],a[i][1]);
}
}
return 0;
}