1089: 成绩查询
Time Limit: 4000MS Memory Limit: 65536KBTotal Submit: 132 Accepted: 9 Page View: 81
Submit Status Discuss
Description
NOIP乐山一中模拟赛的成绩出来了,很多同学急切的想知道自己的成绩,所以经学校商量后决定在网站上公布。但时间很紧!现在提供每个人的用户名、成绩,需要你将成绩排序并根据用户输入的成绩排名输出对应的用户名和排名(成绩少的排名靠前,因为noip题目用的时间越少,排名越靠前)。成绩相同的,用户名字典序小的排名靠前。
Input
第一行是一个正整数n,表示OIer数。 接下来的n 行每行有一个字符串和一个小数,第i 行是编号为i-1 的人的信息,中间用一个空格分隔,字符串代表用户名(只能由大、小写字母,数字和下划线组成),小数代表该人的成绩,每行的首尾不会有多余的空格。 然后是一个正整数m,表示查询的次数。 接下来m 行是每一次查询的信息,每行一个实数k。
Output
对应每一个数k,你都要输出用时为k 且排名最靠前的OIer的用户名及排名(一个正整数),中间用一个空格分隔,如果没有符合条件的人的话就输出”No This OIer”(没有两边的引号)。
5 sqybi 123.345 Core2_Duo 20.203 Vista123 100 o 100.001 0987654321 987654321 2 100.0 123.346
Vista123 2 No This OIer
Hint
对于100%数据,每个人的成绩且都小于10^9,有效位数最多为9 位,小数点后最多三位;每个人的用户名都不相同;k 的范围和每个人成绩的范围相同;每个人的用户名长度不超过10个字节。 对于100%数据,n≤100000,m≤100000。 输入的成绩和查询的成绩只要值相同就算相等,如123.1 与123.100 是同一个数。
Source
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define eps 1e-5
using namespace std;
struct people
{
char na[15];
double gr;
people(){} //无参构造函数
people(double g) //有参构造函数,这两个必须加
{
gr=g;
}
bool operator<(const people a) const
{
if(abs(gr-a.gr)<=eps) return na<a.na;
else return gr<a.gr;
}
}p[100005];
int main()
{
int n,m;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s%lf",p[i].na,&p[i].gr);
}
sort(p,p+n);
scanf("%d",&m);
for(int i=0;i<m;i++)
{
double xx;
scanf("%lf",&xx);
int No=lower_bound(p,p+n,people(xx-eps))-p; //返回大于等于xx-eps的最小指针,所以需要减去头指针p
if((p[No].gr-xx)<=eps)
printf("%s %d\n",p[No].na,No+1); //数组是从0开始,No要加1
else printf("No This OIer\n");
}
return 0;
}