题目链接:http://ac.jobdu.com/problem.php?pid=1034
- 题目描述:
-
浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
- 输入:
-
输入包含多组测试用例.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.
- 输出:
-
请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
- 样例输入:
-
3 1 2 5 -1 5 3 1 2 3 4 5 0 0
- 样例输出:
-
5 5 4 3
这个题目比较简单,思路:
如果n<=m则输入n个数到数组中,然后降序排序,接着直接输出;
若是n>m,则先输入前m个数到数组中。然后当每次输入一个数temp,则判断temp是否比数组中最小的数min大,若是则覆盖掉数组中最小数字min,否则跳过,输入下一个,然后继续……
输入并处理完成后,降序排序,然后输出即可。
代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 int cmp(const void *a,const void *b) 4 { 5 return *(int*)b- *(int *)a; 6 } 7 int finMinIndex(int a[],int len);//返回a数组最小元素的下标。a数组元素个数为len 8 int main() 9 { 10 int n,m; 11 int a[11]={0}; 12 int i; 13 int mini; 14 int temp; 15 16 while(scanf("%d%d",&n,&m)!=EOF) 17 { 18 if(n==0&&m==0) break; 19 if(n<=m) 20 { 21 for(i=0;i<n;i++) scanf("%d",&a[i]); 22 qsort(a,n,sizeof(a[0]),cmp); 23 printf("%d",a[0]); 24 for(i=1;i<n;i++) printf(" %d",a[i]); 25 printf(" "); 26 } 27 else 28 { 29 for(i=0;i<m;i++) 30 { 31 scanf("%d",&a[i]); 32 } 33 for(i=m;i<n;i++) 34 { 35 scanf("%d",&temp); 36 mini=finMinIndex(a,m); 37 if(temp>a[mini]) a[mini]=temp; 38 } 39 qsort(a,m,sizeof(a[0]),cmp); 40 printf("%d",a[0]); 41 for(i=1;i<m;i++) printf(" %d",a[i]); 42 printf(" "); 43 } 44 } 45 return 0; 46 } 47 int finMinIndex(int a[],int len)//返回a数组最小元素的下标。a数组元素个数为len 48 { 49 int i,minIndex=0; 50 for(i=1;i<len;i++) 51 { 52 if(a[i]<a[minIndex]) minIndex=i; 53 } 54 return minIndex; 55 }