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++那個版本發現問題後再改^_^