题目:
思路:针对四种排序方法构建四个结构体,按四种排序排完之后,把结果汇总到代表国家的一个结构体中。然后就是查询就是了。排序规则可通过下面的例子了解一下:
序列: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
*/