8N
夏天來了~~好開心啊,呵呵,好多好多水果~~
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)
// 使用sort+bool進行多條件排序
1 #include<stdio.h>
2 #include<string.h>
3 struct Fruit
4 { char name[81]; char ori[81]; int num; };
5 int main()
6 {
7 int n, m, i,j,k, gap, flag;
8 struct Fruit f[100], t;
9 char name[81], ori[81]; int sum;
10 scanf("%d", &n);
11 while(n--)
12 {
13 scanf("%d", &m);
14 for(i=0;i<m;i++)
15 scanf("%s %s %d", &f[i].name, &f[i].ori, &f[i].num);
16 // 按產地分類,產地按字母順序排列
17 for(gap=m/2; gap>0; gap/=2)
18 for(i=gap; i<m; i++)
19 for(j=i;j-gap>=0&&strcmp(f[j].ori,f[j-gap].ori)<0;j-=gap)
20 { t=f[j-gap]; f[j-gap]=f[j]; f[j]=t; }
21 // 同一產地的水果按照名稱排序,名稱按字母順序排序
22 strcpy(ori,f[0].ori); j=0; int num[100]={0};
23 for(i=1;i<m;i++)
24 {
25 if(strcmp(ori,f[i].ori)==0) num[j]++;
26 else
27 { strcpy(ori,f[i].ori); j++; }
28 } // j=產地數, num[j]=水果數
29 for(i=0,k=0;i<m;i+=num[k]+1,k++)
30 for(gap=(num[k]+1)/2; gap>0; gap/=2)
31 for(i=gap; i<num[k]+1; i++)
32 for(j=i;j-gap>=0&&strcmp(f[j].name,f[j-gap].name)<0;j-=gap)
33 { t=f[j-gap]; f[j-gap]=f[j]; f[j]=t; }
34 strcpy(ori,f[0].ori); strcpy(name,f[0].name); sum=f[0].num;
35 puts(ori);
36 for(i=1;i<m;i++)
37 {
38 if(strcmp(ori,f[i].ori)==0)
39 {
40 if(strcmp(name,f[i].name)==0)
41 sum+=f[i].num;
42 else
43 {
44 printf(" |----%s(%d)
", name, sum);
45 strcpy(name,f[i].name); sum=f[i].num;
46 }
47 }
48 else
49 {
50 printf(" |----%s(%d)
", name, sum);
51 strcpy(ori,f[i].ori); strcpy(name,f[i].name); sum=f[i].num;
52 puts(ori);
53 }
54 }
55 printf(" |----%s(%d)
", name, sum);
56 if(n) printf("
");
57 }
58 return 0;
59 }
WA
1 #include<stdio.h>
2 #include<string.h>
3 #include<algorithm>
4 using namespace std;
5
6 struct Fruit
7 { char name[81]; char ori[81]; int num; } f[100];
8 bool cmp(Fruit a, Fruit b)
9 {
10 // 先按產地分類,產地按字母順序排列
11 if(strcmp(a.ori,b.ori)!=0)
12 return strcmp(a.ori,b.ori)<0;
13 // 同一產地的水果按照名稱排序,名稱按字母順序排序
14 else if(strcmp(a.name,b.name)!=0)
15 return strcmp(a.name,b.name)<0;
16 }
17 int main()
18 {
19 int n,m, i,sum;
20 char ori[81], name[81];
21 scanf("%d", &n);
22 while(n--)
23 {
24 scanf("%d", &m);
25 for(i=0;i<m;i++)
26 scanf("%s %s %d", &f[i].name, &f[i].ori, &f[i].num);
27 sort(f,f+m,cmp);
28 strcpy(ori,f[0].ori); strcpy(name,f[0].name); sum=f[0].num;
29 puts(ori);
30 for(i=1;i<m;i++)
31 {
32 if(strcmp(ori,f[i].ori)==0)
33 {
34 if(strcmp(name,f[i].name)==0)
35 sum+=f[i].num;
36 else
37 {
38 printf(" |----%s(%d)
", name, sum);
39 strcpy(name,f[i].name); sum=f[i].num;
40 }
41 }
42 else
43 {
44 printf(" |----%s(%d)
", name, sum);
45 strcpy(ori,f[i].ori); strcpy(name,f[i].name); sum=f[i].num;
46 puts(ori);
47 }
48 }
49 printf(" |----%s(%d)
", name, sum);
50 if(n) printf("
");
51 }
52 return 0;
53 }
AC
// WA原因待查
總結
- 上一篇: 如何用手机完成文件扫描如何用手机完成文件
- 下一篇: 我们把戴尔的护眼显示器拆了戴尔显示器拆开