寻找大富翁重温

7-38 寻找大富翁(25 分)

2015年胡润研究院的调查显示,截至2014年9月,个人资产在600万元以上高净值人群达290万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。

输入格式:

输入首先给出两个正整数N106)和M10),其中N为总人数,M为需要找出的大富翁数;接下来一行给出N个人的个人资产值,以百万元为单位,为不超过长整型范围的整数。数字间以空格分隔。

输出格式:

在一行内按非递增顺序输出资产排前M位的大富翁的个人资产值。数字间以空格分隔,但结尾不得有多余空格。

输入样例:

8 3
8 12 7 3 20 9 5 18

输出样例:

 
   

20 18 12

这个题之前研究过一次,是用的c语言得了满分,后来再做的时候用的是c++暴力,虽然语句短但是有一个测试点没有过减了一分,找了半天也没有找到bug 下面附上c++的代码,和原来的满分解法

#include<bits/stdc++.h>
using namespace std;
int main()
{

	int n,m,t;
	scanf("%d %d",&n,&m);
	int a[n];

	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(a,a+n);
	if(n>=m)
	{
		for(int i=n-1;i>=n-m;i--)
		{
			if(i==n-m)
			printf("%d",a[i]);
			else
			printf("%d ",a[i]);
		}
	}
	else//第三个测试点不在这里- 
	{
		for(int i=n-1;i>=0;i--)
		{
			if(i==n-1)
			printf("%d",a[i]);
			else
			printf("%d ",a[i]);
		}
	 } 

	
	
}
提交时间状态分数题目编译器耗时用户
2018年3月19日 22:25:58部分正确247-38C++ (g++)233 ms 
测试点结果耗时内存
0答案正确2 ms256KB
1答案正确2 ms256KB
2格式错误2 ms252KB
3答案正确233 ms4156KB

下面是之前的版本,这回加上了注释,加注释再看的时候不至于一脸懵逼


#include<stdio.h>
int main()  
{  
    int i,n,m,k,j;  
    scanf("%d%d",&n,&m);  
    int a[n];  
    int max[m]; //存储前m名大富翁 
    for(i=0;i<m;i++)  
    {  
        max[i]=0;  
    }  
      
    for(i=0;i<n;i++)  
    {  
        scanf("%d",&a[i]);  
        for(j=0;j<m;j++)  
        {  
                  
                if(a[i]>max[j])  
                {  
                      
                    if(j==m-1)//如果是最后一个大富翁,那么直接替换 
                    {  
                        max[j]=a[i];  
                        break;  
                    }  
                    else  
                    {  
                        for(k=m-1;k>j;k--)//从倒数第一个大富翁开始,将前一个大富翁的值依次赋给后一个 
                        {  
                            max[k]=max[k-1];  
                        }  
                        max[j]=a[i];//将空出来的为值赋予新值 
                        break;  
                    }  
                      
                }  
              
              
                  
        }  
          
    }  
    if(n>=m)  
    {  
        for(i=0;i<m;i++)  
        {  
        if(i==m-1)
        printf("%d",max[i]);  
        else  
            printf("%d ",max[i]);  
        }  
    }  
    else  //不是测试点 
    {  
        for(i=0;i<n;i++)  
        {  
        if(i==n-1)  
        printf("%d",max[i]);  
        else  
            printf("%d ",max[i]);  
        }  
    }  
  
      
      
      
} 
2018年3月19日 22:28:19答案正确257-38C (gcc)225 ms 
测试点结果耗时内存
0答案正确2 ms128KB
1答案正确1 ms128KB
2答案正确2 ms128KB
3答案正确225 ms4076KB

这个方法虽然代码较长,但是思路清晰明了,测试点全过,而且耗时较小,c++那个版本发现问题后再改^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值