九度OJ 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
本題的大致意思是 尋找一組數中的最大的前m個數,因為這題m比較小,我選擇遍歷這組數,最多10次就可以得出結果,因為m最大為10。這道題如果選擇直接對n個數排序的話,可能會超時,因為n最大可以為100000,選擇O(n*n)的排序算法的話,必定會超時。
#include <iostream> #include <algorithm> #include <cstring> using namespace std;int main(){int n,m;while(cin>>n>>m){if(n==0 && m==0)break;int *a = new int[n];memset(a,0,sizeof(a));for(int i=0;i<n;i++){cin>>a[i];}int j=1;while(j<=m){int max = -1000;int b = -1;for(int i=0;i<n;i++){if(a[i] > max){max = a[i];b = i;}}a[b] = -1000;cout<<max;if(j < min(m,n)) //肯定不是最后一個數的情況,要加空格cout<<" ";j++;if(j>n)break;}cout<<endl;}return 0; }
??? 每個用例首先包含2個整數n(0<n<=100000)和m(0<m<=10),其中: n為鎮上的人數,m為需要找出的大富翁數, 接下來一行輸入鎮上n個人的財富值.
??? n和m同時為0時表示輸入結束.
本題的大致意思是 尋找一組數中的最大的前m個數,因為這題m比較小,我選擇遍歷這組數,最多10次就可以得出結果,因為m最大為10。這道題如果選擇直接對n個數排序的話,可能會超時,因為n最大可以為100000,選擇O(n*n)的排序算法的話,必定會超時。
#include <iostream> #include <algorithm> #include <cstring> using namespace std;int main(){int n,m;while(cin>>n>>m){if(n==0 && m==0)break;int *a = new int[n];memset(a,0,sizeof(a));for(int i=0;i<n;i++){cin>>a[i];}int j=1;while(j<=m){int max = -1000;int b = -1;for(int i=0;i<n;i++){if(a[i] > max){max = a[i];b = i;}}a[b] = -1000;cout<<max;if(j < min(m,n)) //肯定不是最后一個數的情況,要加空格cout<<" ";j++;if(j>n)break;}cout<<endl;}return 0; }
總結
- 上一篇: 网易之幼儿园小朋友调整队形
- 下一篇: 华为云计算IE面试笔记-桌面云用户登录连