题目链接:水果
题目大意:给出n笔交易,交易包括水果产地,水果名字和价格,要求按如下格式输出
产地
|----水果名称1(收益)
|----水果名称2(收益)
按字母序排列
题目分析:
做法1:结构体排序
用place和name存储当前的产地和名字,
向后比较,每比较到不同的产地就输出上一个的place和和name
如果比较到相同的产地但名字不同,就输出上一个的名字
记得最后一个要额外输出的输出
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=105;
struct node
{
char place[85],name[85];
int p;
bool operator <(const node&n)const
{
if(!strcmp(place,n.place))return strcmp(name,n.name)<0;
else return strcmp(place,n.place)<0;
}
}a[maxn];
int main()
{
//freopen("in.txt","r",stdin);
int T,n,sum;
char name[85],place[85];
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%s %s %d",a[i].name,a[i].place,&a[i].p);
sort(a,a+n);
printf("%s\n",a[0].place);
strcpy(name,a[0].name);
strcpy(place,a[0].place);
sum=a[0].p;
//strcpy(a[n].name,"0");
//strcpy(a[n].place,"0");
for(int i=1;i<n;i++){
if(strcmp(place,a[i].place)){
printf(" |----%s(%d)\n",name,sum);
strcpy(name,a[i].name);
strcpy(place,a[i].place);
sum=a[i].p;
printf("%s\n",place);
}
else if(!strcmp(place,a[i].place)&&strcmp(name,a[i].name)){
printf(" |----%s(%d)\n",name,sum);
strcpy(name,a[i].name);
sum=a[i].p;
}
else sum+=a[i].p;
}
printf(" |----%s(%d)\n",a[n-1].name,sum);
if(T)printf("\n");
}
return 0;
}
做法2:二维map<strng,map<string,int> >
map<strng,map<string,int> >::it映射相同的place
it2=(it->second).begin()映射到相同的name
记得每次case后m要clear()
#include <stdio.h>
#include <string>
#include <map>
#include <iostream>
using namespace std;
const int maxn=105;
int main()
{
//freopen("in.txt","r",stdin);
int T,n,num,sum;
map<string,map<string,int> >m;
scanf("%d",&T);
string name,place;
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>name>>place>>num;
m[place][name]+=num;
}
for(map<string,map<string,int> >::iterator it=m.begin();it!=m.end();++it){
cout<<it->first<<endl;
for(map<string,int>::iterator it2=(it->second).begin();it2!=(it->second).end();++it2){
cout<<" |----"<<it2->first<<"("<<it2->second<<")"<<endl;
}
}
m.clear();
if(T)printf("\n");
}
return 0;
}