zoukankan      html  css  js  c++  java
  • HDU 1236 排名(Microsoft_zzt)

    http://acm.hdu.edu.cn/showproblem.php?pid=1236

    Problem Description
    今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑 
    每题的分值,所以并不是最后的排名。给定录取分数线,请你写程序找出最后通过分数线的 
    考生,并将他们的成绩按降序打印。 
     
    Input
    测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N 
    < 1000 )、考题数M ( 0 < M < = 10 )、分数线(正整数)G;第2行排序给出第1题至第M题的正整数分值;以下N行,每行给出一 
    名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号 
    (题目号由1到M)。 
    当读入的考生人数为0时,输入结束,该场考试不予处理。 
     
    Output
    对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高 
    到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考 
    号的升序输出。 
     
    Sample Input
    4 5 25
    10 10 12 13 15
    CS004 3 5 1 3
    CS003 5 2 4 1 3 5
    CS002 2 1 2
    CS001 3 2 3 5
    1 2 40
    10 30
    CS001 1 2 2 3 20 10 10 10
    CS000000000000000001 0
    CS000000000000000002 2 1 2 0
     
    Sample Output
    3
    CS003 60
    CS001 37
    CS004 37
    0
    1
    CS000000000000000002 20
     
    题解:
    字符串排序:1. 找到两个字符串的最长公共前缀 2. 比较公共前缀后面那个字符的大小即可
    计算分数的和:
    for(int j=1; j<=s[i].m; j++)
                {
                    int x;
                    scanf("%d",&x);
                    s[i].add+=q[x].score;
                }
     
    代码:
    #include <bits/stdc++.h>
    
    using namespace std;
    
    const int maxn = 1e5+10;
    int N,M,G;
    
    struct Students
    {
        char id[21];
        int m;
        int add;
    } s[maxn];
    
    int Com(char s1[maxn],char s2[maxn])
    {
        int len1 = strlen(s1);
        int len2 = strlen(s2);
        int m = min(len1,len2);
        for(int i=0; i<m; i++)
        {
            if(s1[i]-s2[i]>0)
                return 1;
            else if(s1[i]-s2[i]==0)
                continue;
            else
                return -1;
        }
        if(len1==len2)
            return 0;
        else if(len1>len2)
            return 1;
        else
            return -1;
    }
    
    struct Q
    {
        int score;
        int num;
    } q[maxn];
    void display()
    {
        int sum=0;
        for(int i=1; i<=N; i++)
        {
            if(s[i].add>=G)
                sum++;
        }
        printf("%d
    ",sum);
        for(int i=1; i<=N; i++)
        {
            if(s[i].add>=G)
                printf("%s %d
    ",s[i].id,s[i].add);
        }
    }
    
    bool cmpScore( Students& a, Students& b)
    {
        if(a.add==b.add)
            return Com(a.id,b.id)<=0;
        else
            return a.add>b.add;
    }
    
    int main()
    {
        while(~scanf("%d",&N))
        {
            if(N==0)
                break;
            scanf("%d%d",&M,&G);
            for(int i=1; i<=M; i++)
            {
                scanf("%d",&q[i].score);
            }
            for(int i=1; i<=N; i++)
            {
                s[i].add=0;
                scanf("%s%d",s[i].id,&s[i].m);
                for(int j=1; j<=s[i].m; j++)
                {
                    int x;
                    scanf("%d",&x);
                    s[i].add+=q[x].score;
                }
            }
             int L=1,R=N;
                sort(s+L,s+R+1,cmpScore);
            display();
        }
        return 0;
    }
    

      

  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/9232368.html
Copyright © 2011-2022 走看看