[解题报告]List of Conquests
题目大意
题目原文:http://uva.onlinejudge.org/external/104/10420.pdf
背景
题目的原意是说统计被征服人在哪个国家的数目,并且将国家名称按字母表的顺序进行输出。统计被征服的人在这个国家的数目。
Sample Input
3
Spain Donna Elvira
England Jane Doe
Spain Donna Anna
Sample Output
England 1
Spain 2
算法:
还是使用选择冒泡排序。我的代码的基本思路是:
1:将所有的字符输入。
2:忽略人名,将属于国家的字符进行再次记录。
3:将国家名称按字母表顺序排序。
4:进行对国家名的计数。
因为自己还是初学者所以代码比较繁琐,以后多学习提高代码的效率。
代码:这里附上我的代码,你可以去这里提交你的代码验证你的代码是否正确,、
1 #include<stdio.h> 2 #include<string.h> 3 int main(void) 4 { 5 char name[2000][80],country[2000][70],temp[70]; 6 7 int i,n,k,swap,num[2000]; 8 9 while(scanf("%d",&n)!=EOF) 10 { 11 getchar(); //吸收输入n时的回车 12 for(i=0;i<n;i++) 13 gets(name[i]); 14 15 for(i=0;i<n;i++) 16 for(k=0;k<80;k++) 17 { 18 if(name[i][k]==' ')break; 19 else 20 country[i][k]=name[i][k]; 21 } 22 for(i=0;i<n-1;i++) 23 { 24 swap=0; 25 for(k=0;k<n-i-1;k++) 26 { 27 if(strcmp(country[k],country[k+1])>0) 28 { 29 swap=1; 30 strcpy(temp,country[k]); 31 strcpy(country[k],country[k+1]); 32 strcpy(country[k+1],temp); 33 } 34 35 } 36 if(!swap)break; 37 } 38 for(i=0;i<n;i++) 39 num[i]=1; 40 41 for(i=0;i<n;i++) 42 { 43 if(num[i]==0)continue; 44 for(k=i+1;k < n;k++) 45 if(strcmp(country[i],country[k])==0) 46 { 47 num[i]++; 48 num[k]=0; 49 } 50 } 51 for(i=0;i<n;i++) 52 { if(num[i]!=0) 53 printf("%s %d\n",country[i],num[i]); 54 } 55 } 56 return 0; 57 }