acm 排序培训 夏天来了

2、题目描述:

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)

 

4、题目分析及知识点[重点]:

多层排序,以前还没有遇见过。。。

 

5、AC源代码:

#include<stdio.h>

#include<string.h>

int main()

{  

struct out{   

char name[90];

  char prod[90];  

 int num;  }fru[120];

 int T;  

scanf("%d",&T);

 while(T--)

{  

 int M,i,j=0,k,sign,num,temp3;   char name[90],prod[90],temp1[90],temp2[90];  

 scanf("%d",&M);  

 for(i=0;i<M;i++){    

scanf("%s%s%d",name,prod,&num);

   sign=0;  

  for(k=0;k<j;k++)

    if(strcmp(fru[k].name,name)==0&&strcmp(fru[k].prod,prod)==0){     

 fru[k].num+=num;   

   sign=1;    

 }     

if(sign==0){

   strcpy(fru[j].name,name);  

  strcpy(fru[j].prod,prod);   

 fru[j].num=num;   

 j++;  

   }   }  

 k=j;  

 for(j=0;j<k-1;j++)  

  for(i=0;i<k-j-1;i++){     

if(strcmp(fru[i].prod,fru[i+1].prod)>0){

     strcpy(temp1,fru[i+1].prod);

           strcpy(temp2,fru[i+1].name);   

         temp3=fru[i+1].num;

     strcpy(fru[i+1].prod,fru[i].prod);  

          strcpy(fru[i+1].name,fru[i].name);   

         fru[i+1].num=fru[i].num;   

   strcpy(fru[i].prod,temp1);     

       strcpy(fru[i].name,temp2);      

      fru[i].num=temp3;   

  }     

else if(strcmp(fru[i].prod,fru[i+1].prod)==0&&strcmp(fru[i].name,fru[i+1].name)>0){ 

           strcpy(temp2,fru[i+1].name);   

         temp3=fru[i+1].num;     

       strcpy(fru[i+1].name,fru[i].name);     

 fru[i+1].num=fru[i].num;          

  strcpy(fru[i].name,temp2);      

      fru[i].num=temp3;     

}    }  //实现字符串的交换。。。

 for(i=0;i<k;i++){  

  if(i==0){   

  printf("%s\n",fru[i].prod);   

  printf("   |----%s(%d)\n",fru[i].name,fru[i].num);

   }    

else if(strcmp(fru[i].prod,fru[i-1].prod)==0)

    printf("   |----%s(%d)\n",fru[i].name,fru[i].num); 

   else  

  {  

   printf("%s\n",fru[i].prod);  

   printf("   |----%s(%d)\n",fru[i].name,fru[i].num);  

  }   }

  if(T!=0)  

 printf("\n");

 }  

return 0;

}

6、做题心得:

主要是两方面:

A、题复杂,可以分解成若干简单的题来做

B、控制格式,让人头疼啊。。。。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。