题目
思路
结构体的排序,要注意名次相等
代码
#include <iostream>
#include <iostream>
#include <cstring>
#include <stack>
#include <algorithm>
#include <queue>
#include <map>
#include <string>
#define MAXX 250
using namespace std;
int n, m;
struct node
{
int num;
int gold;
int medal;
int people;
double pgold;
double pmedal;
} country[MAXX];
int t[MAXX];
int p1[MAXX], p2[MAXX], p3[MAXX], p4[MAXX];
bool cmp1(node a, node b)
{
return a.gold > b.gold;
}
bool cmp2(node a, node b)
{
return a.medal > b.medal;
}
bool cmp3(node a, node b)
{
return a.pgold > b.pgold;
}
bool cmp4(node a, node b)
{
return a.pmedal > b.pmedal;
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; ++i)
{
cin >> country[i].gold >> country[i].medal >> country[i].people;
country[i].num = i;
country[i].pgold = (double) country[i].gold / country[i].people;
country[i].pmedal = (double) country[i].medal / country[i].people;
}
//111111111
sort(country, country + n, cmp1);
int level = 1;
p1[country[0].num] = level++; //注意这里等级就要改变了
for (int i = 1; i < n; ++i)
{
if (country[i].gold == country[i - 1].gold)
p1[country[i].num] = p1[country[i - 1].num];
else
p1[country[i].num] = level; //这里不改变
level++;
}
//2222222222
sort(country, country + n, cmp2);
level = 1;
p2[country[0].num] = level++;
for (int i = 1; i < n; ++i)
{
if (country[i].medal == country[i - 1].medal)
p2[country[i].num] = p2[country[i - 1].num];
else
p2[country[i].num] = level;
level++;
}
//33333333
sort(country, country + n, cmp3);
level = 1;
p3[country[0].num] = level++;
for (int i = 1; i < n; ++i)
{
if (country[i].pgold == country[i - 1].pgold)
p3[country[i].num] = p3[country[i - 1].num];
else
p3[country[i].num] = level;
level++;
}
//44444444
sort(country, country + n, cmp4);
level = 1;
p4[country[0].num] = level++;
for (int i = 1; i < n; ++i)
{
if (country[i].pmedal == country[i - 1].pmedal)
p4[country[i].num] = p4[country[i - 1].num];
else
p4[country[i].num] = level;
level++;
}
//aaaaaaaaaa
for (int i = 0; i < m; ++i) //最后一个一个来比较
{
cin >> t[i];
}
for (int i = 0; i < m; ++i)
{
int no,minn = MAXX;
if (p1[t[i]]<minn)
{
no=1;
minn = p1[t[i]];
}
if (p2[t[i]]<minn)
{
no=2;
minn = p2[t[i]];
}
if (p3[t[i]]<minn)
{
no=3;
minn = p3[t[i]];
}
if (p4[t[i]]<minn)
{
no=4;
minn = p4[t[i]];
}
if (i!=0)
cout<<' ';
cout<<minn<<":"<<no;
}
return 0;
}
总结
- double类型不能直接接收int,会丢失小数点,要进行类型的强制转化
- 思路要考虑的全面,不能只是样例输出的正确,要全部通用