7-17 奧運排行榜 (25 分)
阿新 • • 發佈:2018-12-12
題目:
思路:針對四種排序方法構建四個結構體,按四種排序排完之後,把結果彙總到代表國家的一個結構體中。然後就是查詢就是了。排序規則可通過下面的例子瞭解一下:
序列:g[0] = 1,g[1] = 2,g[2] = 2, g[3] = 3;
排名:1 ,2 ,2 ,3(並不是1,2,3,4)
程式碼:
#include <bits/stdc++.h> #define FRE() freopen("in.txt","r",stdin) using namespace std; const int maxn = 500; typedef unsigned long long ll; int n,q; struct Country { int g,s; int g_p,s_p; } ct[maxn]; struct node { double gold_p, silver_p; int g, s; int id; } g[maxn],s[maxn],g_p[maxn],s_p[maxn]; void init() { cin>>n>>q; for(int i = 0; i<n; i++) { int num; cin>>g[i].g>>s[i].s>>num; g_p[i].gold_p = 1.0*g[i].g/num; s_p[i].silver_p = 1.0*s[i].s/num; g[i].id = s[i].id = g_p[i].id = s_p[i].id = i; } return; } bool cmdg(node& a, node& b) { if(a.g == b.g) return a.id<b.id; return a.g > b.g; } bool cmds(node& a,node& b) { if(a.s==b.s) return a.id<b.id; return a.s > b.s; } bool cmdg_p(node& a,node& b) { return a.gold_p > b.gold_p; } bool cmds_p(node& a,node& b) { return a.silver_p > b.silver_p; } int main() { init(); sort(g,g+n,cmdg); int lastid = 0; ct[g[0].id].g = 0; for(int i = 1; i<n; i++) { if(g[i].g==g[i-1].g) ct[g[i].id].g = lastid; else { ct[g[i].id].g = i; lastid = i; } } sort(s,s+n,cmds); lastid = 0; ct[s[0].s].s = 0; for(int i = 1; i<n; i++) { if(s[i].s==s[i-1].s) ct[s[i].id].s = lastid; else { ct[s[i].id].s = i; lastid = i; } } sort(g_p,g_p+n,cmdg_p); lastid = 0; ct[g_p[0].id].g_p = 0; for(int i = 1; i<n; i++) { if(g_p[i].gold_p == g_p[i-1].gold_p) ct[g_p[i].id].g_p = lastid; else { ct[g_p[i].id].g_p = i; lastid = i; } } sort(s_p,s_p+n,cmds_p); lastid = 0; ct[s_p[0].id].s_p = 0; for(int i = 1; i<n; i++) { if(s_p[i].silver_p == s_p[i-1].silver_p) ct[s_p[i].id].s_p = lastid; else { ct[s_p[i].id].s_p = i; lastid = i; } } for(int i = 0; i<q; i++) { int tmp,f,ans; cin>>tmp; f = 1,ans = ct[tmp].g; if(ct[tmp].s<ans) f = 2,ans = ct[tmp].s; if(ct[tmp].g_p<ans) f = 3,ans = ct[tmp].g_p; if(ct[tmp].s_p<ans) f = 4,ans = ct[tmp].s_p; if(i) cout<<" "; cout<<ans+1<<":"<<f; } return 0; } /* 樣例輸入: 4 4 51 100 1000 36 110 300 6 14 32 5 18 40 0 1 2 3 樣例輸出: 1:1 1:2 1:3 1:4 */