【t043】成绩查询

来源:互联网 发布:小里弗斯 知乎 编辑:程序博客网 时间:2024/04/27 14:27

Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

说起测试计算机的软件,排在第一位的就应当是SuperPi 了。它不但能良好的体现机器的整体水平,而且还很小巧,更令人惊讶
的是它是一款绿色软件!SuperPi 的成绩是用毫秒计算的,如果时间越短说明成绩越好。大家都经常会把自己的SuperPi 成绩发
布到网上,以和别人比较,当然也是为了炫耀自己的机器。这样,有些网站就要对大家的成绩进行排序并输出,另外一些技术比
较完善的网站就会提供成绩查询的功能。现在,你就要完成这样一个查询程序。
现在提供每个人的用户名、成绩,需要你将成绩排序并根据用户输入的排名输出对应的用户名和成绩。
【输入格式】

第一行是一个正整数n,表示用户的个数。
接下来的n 行每行有一个字符串和一个小数,第i 行是编号为i-1 的人的信息,中间用一个空格分隔,字符串代表用户名(只能由大
、小写字母,数字和下划线组成),小数代表该人的成绩,每行的首尾不会有多余的空格。
然后是一个正整数m,表示查询的次数。
接下来m 行是每一次查询的信息,每行一个实数k。
【输出格式】

对应每一个数k,你都要输出用时为k 的人的用户名及排名(一个正整数),中间用一个空格分隔,如果没有符合条件的人的话就输
出”No Such User”(没有两边的引号)。 【数据范围】 对于10%数据,n≤100,m≤100。
对于30%数据,n≤100000,m≤100。
对于100%数据,n≤100000,m≤1000。
对于100%数据,每个人的成绩各不相同且都小于10^9,有效位数最多为9 位,小数点后最多三位;每个人的用户名都不相同;k 的范
围和每个人成绩的范围相同;每个人的用户名长度不超过10 个字节。
【说明】
输入的成绩和查询的成绩只要值相同就算相等,如123.1 与123.100 是同一个数。
Sample Input

5
sqybi 123.345
Core2_Duo 20.203
Vista123 100
o 100.001
0987654321 987654321
2
100.0
123.346

Sample Output

Vista123 2
No Such User

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t043

【题解】

把输入的数据按照成绩升序排一下就好
1.200
和1.20
直接用==号比较就可以了;
在询问的时候写个二分就好;

【完整代码】

#include <cstdio>#include <cstdlib>#include <cmath>#include <set>#include <map>#include <iostream>#include <algorithm>#include <cstring>#include <queue>#include <vector>#include <stack>#include <string>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define LL long long#define rep1(i,a,b) for (int i = a;i <= b;i++)#define rep2(i,a,b) for (int i = a;i >= b;i--)#define mp make_pair#define pp push_back#define fi first#define se secondusing namespace std;typedef pair<int,int> pii;typedef pair<LL,LL> pll;void rel(LL &r){    r = 0;    char t = getchar();    while (!isdigit(t) && t!='-') t = getchar();    LL sign = 1;    if (t == '-')sign = -1;    while (!isdigit(t)) t = getchar();    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();    r = r*sign;}void rei(int &r){    r = 0;    char t = getchar();    while (!isdigit(t)&&t!='-') t = getchar();    int sign = 1;    if (t == '-')sign = -1;    while (!isdigit(t)) t = getchar();    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();    r = r*sign;}//const int MAXN = x;const int dx[5] = {0,1,-1,0,0};const int dy[5] = {0,0,0,-1,1};const double pi = acos(-1.0);const int MAXN = 1e5+100;struct abc{    char s[20];    double t;};int n,m;abc a[MAXN];bool cmp(abc a,abc b){    return a.t < b.t;}int main(){    //freopen("F:\\rush.txt","r",stdin);    rei(n);    rep1(i,1,n)        scanf("%s%lf",a[i].s,&a[i].t);    sort(a+1,a+1+n,cmp);    rei(m);    rep1(i,1,m)    {        double x;        scanf("%lf",&x);        int l = 1,r = n,ans = -1,mid;        while (l <= r)        {            mid = (l+r)>>1;            if (a[mid].t==x)            {                ans = mid;                break;            }            else                if (a[mid].t<x)                    l = mid+1;                else                    r = mid-1;        }        if (ans == -1)            puts("No Such User");        else            printf("%s %d\n",a[mid].s,mid);    }    return 0;}
0 0