尋找大富翁重溫

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章