水果

Problem Description

夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了.

Input

第一行正整数N(0

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)

解题思路:这道题的要求就是相同产地归为一类,相同水果进行计数,且输出是按字典序输出的。很基础的题目。怎么处理相同产地相同种类的水果数呢?我的做法就是如果当前的记录与下一条记录有相同的产地和相同的某种水果,就将这条记录的num计数存放到下一个记录中,同时将这条记录的num赋值为0,当比较到与下一个不相同的时候就先输出当前的产地,然后从前往当前遍历,如果产地相同,且num不为0,即可输出当前产地某种水果的总数量。

AC代码:

 1 #include
 2 using namespace std;
 3 struct node
 4 {
 5     char fruit[81];//水果名称
 6     char area[81];//产地名称
 7     int num;//交易次数
 8 }c[101];
 9 bool cmp(node x,node y)//排序规则
10 {
11     if(strcmp(x.area,y.area)<0)return true;//产地先从小到大排序
12     if(strcmp(x.area,y.area)==0 && strcmp(x.fruit,y.fruit)<0)return true;//如果产地相同,则按照字典将水果排序
13     return false;//否则返回假
14 }
15 int main()
16 {
17     int N,M;
18     cin>>N;
19     while(N--){    //测试数据组数
20         cin>>M;
21         getchar();   //吃掉回车符
22         for(int i=0;i>c[i].fruit>>c[i].area>>c[i].num;
24         sort(c,c+M,cmp);//按规则排序
25         for(int i=0;i

 下面是string版本:

 1 #include
 2 using namespace std;
 3 struct node
 4 {
 5     string fruit;//水果名称
 6     string area;//产地名称
 7     int num;//交易次数
 8 }c[101];
 9 bool cmp(node x,node y)//排序规则
10 {
11     if(x.area!=y.area)return x.area>N;
18     while(N--){    //测试数据组数
19         cin>>M;
20         getchar();   //吃掉回车符
21         for(int i=0;i>c[i].fruit>>c[i].area>>c[i].num;
23         sort(c,c+M,cmp);//按规则排序
24         for(int i=0;i

你可能感兴趣的:(水果)