題目1007 奧運排序問題

2021-07-28 19:33:13 字數 3546 閱讀 4602

時間限制:1 秒

記憶體限制:32 兆

特殊判題:否

提交:9031

解決:1952

題目描述:按要求,給國家進行排名。

輸入:有多組資料。

第一行給出國家數n,要求排名的國家數m,國家號從0到n-1。

第二行開始的n行給定國家或地區的奧運金牌數,獎牌數,人口數(百萬)。

接下來一行給出m個國家號。

輸出:排序有4種方式: 金牌總數 獎牌總數 金牌人口比例 獎牌人口比例 

對每個國家給出最佳排名排名方式 和 最終排名

格式為: 排名:排名方式

如果有相同的最終排名,則輸出排名方式最小的那種排名,對於排名方式,金牌總數 < 獎牌總數 < 金牌人口比例 < 獎牌人口比例 

如果有並列排名的情況,即如果出現金牌總數為 100,90,90,80.則排名為1,2,2,4.

每組資料後加乙個空行。

樣例輸入:

4 4

4 8 1

6 6 2

4 8 2

2 12 4

0 1 2 3

4 28 10 1

8 11 2

8 12 3

8 13 4

0 3

樣例輸出:

1:3

1:12:1

1:21:1

1:1

2023年浙江大學計算機及軟體工程研究生機試真題

答疑:

分析:之前看了半天題目都理解不了,大概是這麼個意思:給出需要排序的國家,每個國家分別按照金牌總數 、 獎牌總數 、 金牌人口比例 、 獎牌人口比例四種排名。也即每個國家有四個排名結果,然後選取排名結果最高的排名,如果有並列的排名,則輸出排名方式最小的排名。四種排名分別為1,2,3,4; 

注意:這裡有乙個很含糊的情況說明一下。就是給出需要排名的國家號不一定都是按照公升序排列的,也就是說可以這樣給3,1,2,0(需要排序的國家號)。這個問題因為沒有考慮到導致提交一直通不過。 

我寫的**如下:

#include #include #include using namespace std;

struct pm //對所有國家的排名進行儲存

temp[1000][4];

struct country

array[1000],b[1000];//b存的是參與排名的國家,num表示參與排名的給出的國家先後

int cmp1(const country &a,const country &b)

int cmp2(const country &a,const country &b)

int c***(const country &a,const country &b)

int cmp4(const country &a,const country &b)

int cmp5(const pm &a,const pm &b)

for(int i=0;i>j;

b[i]=array[j];

b[i].num=i;

}sort(b,b+c2,cmp1);//對金牌排序

for(int i=0;i第二個思路是借鑑別人的,排序也是純粹的自己寫的,感覺邏輯挺好,就拿過來比對一下。

/*********************************

* 日期:2013-3-3

* 題號: 九度oj 題目1007:奧運排序問題

* 結果:ac

* 總結:

**********************************/

#include#include#include//結構體

typedef struct countrycountry;

country country[1000];

int main ()

//給出要排序的m個國家號。

for(i = 0;i < m;i++)

for(i = 0;i < m;i++)

} countrysort[i].bestrank = countrysort[i].rank;

//printf("j:%d\n",countrysort[i].bestrank);

countrysort[i].skind = 1;

//獎牌數排序

countrysort[i].rank = 1;

for(j = 0;j < n;j++)

} if(countrysort[i].rank < countrysort[i].bestrank)

//printf("j2:%d\n",countrysort[i].rank);

//金牌人口比例排序

countrysort[i].rank = 1;

for(j = 0;j < n;j++)

} if(countrysort[i].rank < countrysort[i].bestrank)

//printf("j3:%d\n",countrysort[i].rank);

//獎牌人口比例排序

countrysort[i].rank = 1;

for(j = 0;j < n;j++)

} if(countrysort[i].rank < countrysort[i].bestrank)

//printf("j4:%d\n",countrysort[i].rank);

//輸出

printf("%d:%d\n",countrysort[i].bestrank,countrysort[i].skind);

} //每組資料後加乙個空行。

printf("\n");

}//while

return 0;

}

下面這個是我們班何大神寫的,**量果然降低了不少。

#include #include #include using namespace std;

struct country

a[10000],b[10000];

bool cmp1(country a,country b)

bool cmp2(country a,country b)

bool c***(country a,country b)

bool cmp4(country a,country b)

int rank[10000][4];

int n,m;

int main()

for (int i=0;i>r;

b[i]=a[r];

b[i].index=i;

}sort(b,b+m,cmp1);

rank[b[0].index][0]=1;

for (int i=1;i

題目1007 奧運排序問題

題目1007 奧運排序問題 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 3180 解決 669 題目描述 按要求,給國家進行排名。輸入 有多組資料。第一行給出國家數n,要求排名的國家數m,國家號從0到n 1。第二行開始的n行給定國家或地區的奧運金牌數,獎牌數,人口數 百萬 接下來一行...

題目1007 奧運排序問題

題目1007 奧運排序問題 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 3180 解決 669 題目描述 按要求,給國家進行排名。輸入 有多組資料。第一行給出國家數n,要求排名的國家數m,國家號從0到n 1。第二行開始的n行給定國家或地區的奧運金牌數,獎牌數,人口數 百萬 接下來一行...

題目1007 奧運排序問題(結構體排序)

每個國家根據金牌總數 獎牌總數 金牌人口比例 獎牌人口比例會有四種排序,找到最佳排名。我們用結構體把每個國家的資訊存下來,在進行處理。根據四種不同的排序方式計算得出四種排名。注意 記得最後再把國家按照最大是的順序排回來 事先用id屬性記下序號 有關於sort函式使用詳解請參考 created by ...