トピックの説明:
毎年、オリンピックの主要メディアがランキングを公開していますが、注意深い読者は、国によってランキングがわずかに異なることに気づきます。たとえば、中国が金メダルの総数で1位になると、中国のメディアは「金メダルリスト」を発表します。米国はメダルの総数で1位になるのに対し、米国のメディアは「医療リスト」を発表します。人口の少ない国が「国民一人当たりのメダルリスト」を発行すれば、アフリカ諸国がリーダーになるかもしれません…では、相談する国ごとに最適な方法で計算するプログラムを書いてください。ランキング。
入力形式:入力
の最初の行は、ランキングに参加している国と地域の総数である2つの正の整数NとM(世界に224の国と地域があるため≤224)を示します。国の数を参照してください。簡単にするために、国に0からN-1までの番号を付けます。その後、N行の入力があります.i番目の行は、金メダルの数、メダルの数、およびi-1の番号が付けられた国の国民人口(百万単位)を示します。数字はすべて整数です。間隔[0,1000]、スペースで区切ります。最後の行は、相談に来るMか国の数をスペースで区切って示しています。
出力形式:
相談に来た国のランキングを1行で出力します:計算方法番号。そのランキングは、その国で最も有利な方法に従って計算されます。計算方法には番号が付けられます。金メダルリスト= 1、メダルリスト= 2、1人あたりの全国金メダルリスト= 3、1人あたりの全国メダルリスト= 4。出力はスペースで区切られ、出力の最後に余分なスペースを入れることはできません。
国が異なるランキング方法で同じランキングを持っている場合、最も少ない数の計算方法が出力されます。
入力例:
4 4
51100 1000
36110300
6 14 32
5 18 40
0 1 2 3
出力例:
1:1 1:2 1:3 1:4
サンプル図:
問題分析:問題
を解決するための鍵は、キーワードを並べ替えることです。ここでは、ライブラリ関数qsort()を直接呼び出して並べ替えることを選択します。
この質問の詳細な処理には、次のものが含まれ
ます。a。特定のキーワードで並べ替えてから、ランキングを並列化します。簡単な方法は、並べ替え後に順序付けられたシーケンスをスキャンし、一時変数を使用して現在のランキングを記録し、現在のデータを前のデータと比較します。値が等しい場合は、現在のランキングを引き続き使用します。それ以外の場合は、現在のランキングを次のように更新します。シーケンス内の現在のデータの位置。
b。国が異なるランキング方法で同じランキングを持っている場合、最小数の計算方法を出力する必要があります。国ごとに2つの変数を設定できます。1つは現在の最高ランキングを記録し、もう1つはランキングに対応するキーワード番号を記録します。ランキングの並べ替えは、番号が最も小さいキーワードから順に並べ替えます。国の最高のランキングが更新された場合にのみ、対応するキーワード番号(つまり、計算方法の番号)が変更されます。
いつものように、最初にコーディングしてから、ゆっくりと分析してみましょう。
#include <stdio.h>
#include <stdlib.h>
int n,m;
typedef struct{
int id,gold,medal,population,rank,way,R;
/*编号、金牌数、奖牌数、人口数、排名、计算方式编号、
R用来存储临时排名,与当前排名进行比较。如果临时排名比当前排名靠前,则临时排名替换当前排名。*/
double ave_gold,ave_medal;//人均金牌数、人均奖牌数。
}Q,*q;
Q a[230];
int b[230];//存储最后一行给出的m个前来咨询的国家编号。
struct Node{
int rank,way;//用来存储最后的结果。
}w[230];
int cmp1(const void *a,const void *b)
{
q pa=(q)a;
q pb=(q)b;
int num1=pa->gold;
int num2=pb->gold;
return num2-num1;
}
int cmp2(const void *a,const void *b)
{
q pa=(q)a;
q pb=(q)b;
int num1=pa->medal;
int num2=pb->medal;
return num2-num1;
}
int cmp3(const void *a,const void *b)
{
q pa=(q)a;
q pb=(q)b;
double num1=pa->ave_gold;
double num2=pb->ave_gold;
if(num1-num2<0)
return 1;
else
return -1;
}
int cmp4(const void *a,const void *b)
{
q pa=(q)a;
q pb=(q)b;
double num1=pa->ave_medal;
double num2=pb->ave_medal;
if(num1-num2>0)
return -1;
else
return 1;
}
int main()
{
scanf("%d%d",&n,&m);
int i;
for(i=0;i<n;i++)
{
a[i].id=i;//初始化。
scanf("%d%d%d",&a[i].gold,&a[i].medal,&a[i].population);
a[i].ave_gold=(double)a[i].gold/a[i].population;
a[i].ave_medal=(double)a[i].medal/a[i].population;
}
qsort(a,n,sizeof(Q),cmp1);
for(i=0;i<n;i++)
{
a[i].way=1;//排名方法初始化为第一种方式。
if(i>=1&&a[i].gold==a[i-1].gold)//记录排名,处理并列名次情况。
a[i].rank=a[i-1].rank;
else
a[i].rank=i+1;//记录排名名次。
}
qsort(a,n,sizeof(Q),cmp2);
for(i=0;i<n;i++)
{
if(i>=1&&a[i].medal==a[i-1].medal)R成员记录临时排名,方便与上一种排名方法的名次进行比较。
a[i].R=a[i-1].R;
else
a[i].R=i+1;
if(a[i].rank>a[i].R)//与上次排名相比看是否能做到更优
{
//若当前比较方法与上一种比较方法更优,则排名与方法都更新,以下两种方式同理。
a[i].rank=a[i].R;
a[i].way=2;
}
}
qsort(a,n,sizeof(Q),cmp3);
for(i=0;i<n;i++)
{
if(i>=1&&a[i].ave_gold==a[i-1].ave_gold)
a[i].R=a[i-1].R;
else
a[i].R=i+1;
if(a[i].rank>a[i].R)
{
a[i].rank=a[i].R;
a[i].way=3;
}
}
qsort(a,n,sizeof(Q),cmp4);
for(i=0;i<n;i++)
{
if(i>=1&&a[i].ave_medal==a[i-1].ave_medal)
a[i].R=a[i-1].R;
else
a[i].R=i+1;
if(a[i].rank>a[i].R)
{
a[i].rank=a[i].R;
a[i].way=4;
}
}
for(i=0;i<n;i++)//w结构体数组记录每一个编号的答案。
{
w[a[i].id].rank=a[i].rank;
w[a[i].id].way=a[i].way;
}
for(i=1;i<=m;i++)
scanf("%d",&b[i]);
for(i=1;i<m;i++)
printf("%d:%d ",w[b[i]].rank,w[b[i]].way);
printf("%d:%d",w[b[m]].rank,w[b[m]].way);
return 0;
}
参考資料ポータル:
https ://blog.csdn.net/a2580ah/article/details/109101818?utm_medium = distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id = 844bf240-3fe9-depth -utm_source = distribute。 pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
この質問は主に、これに基づいてある程度改善されたqsort()関数の呼び出しを調べますが、それはやや困難です。
さて、この共有は最初にここで停止します。これについて質問がある場合は、コメント領域にメッセージを残してください。ご参加ありがとうございました!