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

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

 

转载于:https://www.cnblogs.com/huashanqingzhu/p/4388490.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值