
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct info{
char pro[90],name[90];
int num;
}info;
int cmp(const void* a, const void* b){
info arg1 = *(const info*)a;
info arg2 = *(const info*)b;
if(strcmp(arg1.pro, arg2.pro)>0){
return 1;
}
else if(strcmp(arg1.pro, arg2.pro)<0){
return -1;
}
else{
if(strcmp(arg1.name, arg2.name)>0){
return 1;
}
else if(strcmp(arg1.name, arg2.name)<0){
return -1;
}
else{
return 0;
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
info in[120],pros[100][100];
int n,i,j,indexpro=0,indexfruit=0,rec[100]={0};
memset(in, 0, sizeof(in));
memset(pros, 0, sizeof(pros));
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%s %s %d",in[i].name,in[i].pro,&in[i].num);
}
qsort(in, n, sizeof(info), cmp);
pros[0][0]=in[0];
for(i=1;i<n;i++){
if(strcmp(in[i].pro, in[i-1].pro)==0){
if(strcmp(in[i].name, in[i-1].name)==0){
strcpy(pros[indexpro][indexfruit].name, in[i].name);
strcpy(pros[indexpro][indexfruit].pro, in[i].pro);
pros[indexpro][indexfruit].num+=in[i].num;
}
else{
indexfruit++;
rec[indexpro]++;
strcpy(pros[indexpro][indexfruit].name, in[i].name);
strcpy(pros[indexpro][indexfruit].pro, in[i].pro);
pros[indexpro][indexfruit].num+=in[i].num;
}
}
else{
indexpro++;
indexfruit=0;
strcpy(pros[indexpro][indexfruit].name, in[i].name);
strcpy(pros[indexpro][indexfruit].pro, in[i].pro);
pros[indexpro][indexfruit].num+=in[i].num;
}
}
for(i=0;i<=indexpro;i++){
printf("%sn",pros[i][0].pro);
for(j=0;j<=rec[i];j++){
printf(" |----%s(%d)n",pros[i][j].name,pros[i][j].num);
}
}
if(t!=0){
printf("n");
}
}
return 0;
}
这道题利用了快排函数的灵活性,我看网上有人用map做,没大有思路,就用了结构体做,利用我做PAT的经验,还是不难的.




近期评论