九度oj 题目1034:寻找大富翁

  1. 云栖社区>
  2. 博客>
  3. 正文

九度oj 题目1034:寻找大富翁

华山青竹 2015-04-02 21:42:00 浏览537
展开阅读全文

题目链接: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

来源:2009年浙江大学计算机及软件工程研究生机试真题

这个题目比较简单,思路:

如果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("\n");
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("\n");
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 }

 

网友评论

登录后评论
0/500
评论
华山青竹
+ 关注