Problem Description:
夏天来了~~好开心啊,呵呵,好多好多水果~~
Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了.
Input:
第一行正整数N(0<N<=10)表示有N组测试数据.
每组测试数据的第一行是一个整数M(0<M<=100),表示工有M次成功的交易.其后有M行数据,每行表示一次交易,由水果名称(小写字母组成,长度不超过80),水果产地(小写字母组成,长度不超过80)和交易的水果数目(正整数,不超过100)组成.
Output:
对于每一组测试数据,请你输出一份排版格式正确(请分析样本输出)的水果销售情况明细表.这份明细表包括所有水果的产地,名称和销售数目的信息.水果先按产地分类,产地按字母顺序排列;同一产地的水果按照名称排序,名称按字母顺序排序.
两组测试数据之间有一个空行.最后一组测试数据之后没有空行.
Sample Input:
1
5
apple shandong 3
pineapple guangdong 1
sugarcane guangdong 1
pineapple guangdong 3
pineapple guangdong 1
Sample Output:
guangdong
|----pineapple(5)
|----sugarcane(1)
shandong
|----apple(3)
思路:这道题其实不难,主要要注意排序问题,字符串排序要用strcmp,另外要注意输出格式,两组数据之间要有空行,最后一组没有。
My DaiMa:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct fruit
{
char name[82],place[82];
int num;
}s[101];
int cmp(fruit x,fruit y)//sort函数自定义排序,根据产地和名称进行排序
{
if(strcmp(x.place,y.place)==0)
return strcmp(x.name,y.name)<0;
else
return strcmp(x.place,y.place)<0;
}
int main()
{
int t,n,m;
char a[82],b[82];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int k=0;
while(n--){
int flag=0;
scanf("%s %s %d",a,b,&m);
for(int i=0;i<k;i++){ //若此水果出现过,则更新水果的销售数目
if(strcmp(a,s[i].name)==0&&strcmp(b,s[i].place)==0){
s[i].num+=m;
flag=1;
}
}
if(flag==0)//如果有没有出现过的产地和水果名儿,就在数组中加上他们
{
strcpy(s[k].name,a);
strcpy(s[k].place,b);
s[k].num=m;
k++;
}
}
sort(&s[0],&s[0]+k,cmp);
int j=0;
printf("%s\n",s[0].place);
for(int i=0;i<k;i++){ //接下来根据水果产地进行输出
if(strcmp(s[i].place,s[j].place)==0)
printf(" |----%s(%d)\n",s[i].name,s[i].num);
else{
printf("%s\n",s[i].place);
printf(" |----%s(%d)\n",s[i].name,s[i].num);
j=i;
}
}
if(t>=1)
cout<<endl;
}
return 0;
}