一、概述
筛选。
首先上级部分没到200筛掉。
然后排序输出所有总分大于60的。
唯一的坑点:分数都是整数,但是当乘以一个系数后会出现小数。这时就要注意题目中怎么要求取整的了。
我原来是以为每次乘完之后的结果都要四舍五入,但是注意要求是“G must be rounded up to an integer”,即G要向上取整,因此最后一个测试点没过。
二、分析
首先用map映射名字与编号,然后排序即可。
如果是要求每个加数都要四舍五入,那么代码如下:
node[i].G=round(node[i].Gm*0.4)+round(node[i].Gf*0.6);
如果要求最终结果向上取整,那么代码如下:
node[i].G=(node[i].Gm*0.4)+(node[i].Gf*0.6)+0.5;
注意所有的变量全是int。
使用+0.5可以很好地实现向上取整。当然要注意是在所有的都加完之后再加0.5。不能加两次,那就错了。
三、总结
向上取整使用+0.5,四舍五入用round。
PS:代码如下:
#include<stdio.h>
#include<cstdio>
#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<queue>
#include<string>
#include<cstring>
#include<math.h>
#include<algorithm>
using namespace std;
map<string,int> m;
struct Node
{
string name;
int Gp=-1,Gm=-1,Gf=-1,G=0;
}node[10010];
bool cmp(Node a,Node b)
{
if(a.G!=b.G)
return a.G>b.G;
else
return a.name<b.name;
}
int main()
{
int P,M,N;
scanf("%d %d %d",&P,&M,&N);
int num=0;
for(int i=0;i<P;i++)
{
int score;
string name;
cin>>name;
scanf("%d",&score);
if(score<200||score>900)
continue;
else
{
m[name]=num;
node[num].Gp=score;
node[num].name=name;
num++;
}
}
for(int i=0;i<M;i++)
{
int score;
string name;
cin>>name;
scanf("%d",&score);
if(m.find(name)!=m.end())
{
node[m[name]].Gm=score;
}
}
for(int i=0;i<N;i++)
{
int score;
string name;
cin>>name;
scanf("%d",&score);
if(m.find(name)!=m.end())
{
node[m[name]].Gf=score;
}
}
for(int i=0;i<num;i++)
{
if(node[i].Gm>node[i].Gf)
node[i].G=(node[i].Gm*0.4)+(node[i].Gf*0.6)+0.5;
else
node[i].G=node[i].Gf;
}
sort(node,node+num,cmp);
for(int i=0;i<num;i++)
{
if(node[i].G>=60&&node[i].G<=100)
cout<<node[i].name<<" "<<node[i].Gp<<" "<<node[i].Gm<<" "<<node[i].Gf<<" "<<node[i].G<<"\n";
}
}