7-38 寻找大富翁(25 分)
2015年胡润研究院的调查显示,截至2014年9月,个人资产在600万元以上高净值人群达290万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。
输入格式:
输入首先给出两个正整数N(≤106)和M(≤10),其中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 | 部分正确 | 24 | 7-38 | C++ (g++) | 233 ms |
测试点 | 结果 | 耗时 | 内存 |
---|---|---|---|
0 | 答案正确 | 2 ms | 256KB |
1 | 答案正确 | 2 ms | 256KB |
2 | 格式错误 | 2 ms | 252KB |
3 | 答案正确 | 233 ms | 4156KB |
下面是之前的版本,这回加上了注释,加注释再看的时候不至于一脸懵逼
#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 | 答案正确 | 25 | 7-38 | C (gcc) | 225 ms |
测试点 | 结果 | 耗时 | 内存 |
---|---|---|---|
0 | 答案正确 | 2 ms | 128KB |
1 | 答案正确 | 1 ms | 128KB |
2 | 答案正确 | 2 ms | 128KB |
3 | 答案正确 | 225 ms | 4076KB |
这个方法虽然代码较长,但是思路清晰明了,测试点全过,而且耗时较小,c++那个版本发现问题后再改^_^