【t043】成绩查询

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 second

using 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
",a[mid].s,mid);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626939.html