zoukankan      html  css  js  c++  java
  • soj1022. Poor contestant Prob

    1022. Poor contestant Prob

    Constraints

    Time Limit: 1 secs, Memory Limit: 32 MB

    Description

     

    As everybody known, “BG meeting” is very very popular in the ACM training team of ZSU. 
    After each online contest, they will go out for “smoking”. Who will be the poor ones that have to BG the others? Of course, the half who solve less problems. 
    The rule runs well when the number of the contestants is even. But if the number is odd, it is impossible to divide them into two equal parts. It gives a dilemma to the BG meeting committee. After a careful discussion with Mr. Guo, a new rule emerged: if the number of the contestant is odd, the committee will first sort the contestants according to the number of problems they solved, and then they will pick out the middle one. This poor boy or girl will have no chance to attend the BG meeting. 
    Strange rule, isn`t it?
    As the number of the contestants is becoming more and more large, the committee need to write a program which will pick out the poor one efficiently.
    Note that: Every contestant solves different number of problems. The total number of the contestants will not exceed 10^5.

     

    Input

     

    There are several cases in the input. The first line of the input will be an integer M, the number of the cases.
    Each case is consisted of a list of commands. There are 3 types of commands.
    1. Add xxx n : add a record to the data base, where xxx is the name of the contestant, which is only consisted of at most 10 letters or digits, n is the number of problems he/she solved. (Each name will appear in Add commands only once).
    2.Query :
    3.End :End of the case.

     

    Output

     

    1.For the Query command: If the current number of contestants is odd, the program should output the poor contestant’s name currently even if there is only one contestants, otherwise, just out put “No one!” (without quotes).
    2.For the End command: 
       If the total number of contestants in the data base is even, you should out put “Happy BG meeting!!”(without quotes),otherwise, you should out put the “xxx is so poor. ”(without quotes) where xxx is the name of the poor one.
    3.Each case should be separated by a blank line.

     

    Sample Input

    2
    Add Magicpig 100
    Add Radium 600
    Add Kingfkong 300
    Add Dynamic 700 
    Query
    Add Axing 400
    Query
    Add Inkfish 1000
    Add Carp 800
    End
    
    Add Radium 100
    Add Magicpig 200
    End

    Sample Output

    No one!
    Axing
    Radium is so poor.
    
    Happy BG meeting!!

    Problem Source

    ZSUACM Team Member

     

    这个题目思路并不复杂,就是建两个优先队列,一个最大堆,一个最小堆,在插入过程不断维护,使得两个堆size尽可能相同。

    问题就是,做完之后会超时,百度了一下,发现是那个scanf和printf能更省时(蛋疼,我真不爱用这个)。然后还得把所有的string都变成char[]

    终于给过了。。。。。。

    #include <iostream>
    #include <queue>
    #include <cstring>
    #include <vector>
    #include <cstdio>
    #include <string>
    using namespace std;
    
    struct contestant
    {
    	string name;
    	int num;
    };
    //建立一个最大堆和最小堆(优先队列实现)
    struct Greater
    {
    	bool operator()(const contestant &a,const contestant &b)
    	{
    		return a.num < b.num;
    	}
    };
    
    struct Less
    {
    	bool operator()(const contestant &a,const contestant &b)
    	{
    		return a.num > b.num;
    	}
    };
    
    int main()  
    {  
        int M;  
        scanf("%d",&M);  
        while(M--)  
        {  
            priority_queue<contestant,vector<contestant>,Less> MIN;  
            priority_queue<contestant,vector<contestant>,Greater> MAX;  
            //string command;  
            char command[20];  
            while(scanf("%s",command))  
            {  
                if(strcmp(command,"Add")==0)  
                {  
                    char name1[20];  
                    scanf("%s",name1);  
                    string name(name1);  
                    int number;  
                    scanf("%d",&number);  
                    const contestant tmp={name,number};  
                    if(MAX.size()==MIN.size())  
                    {  
                        if(MAX.empty() || tmp.num < MIN.top().num)  
                            MAX.push(tmp);  
                        else if(tmp.num > MIN.top().num)  
                        {  
                            MAX.push(MIN.top());  
                            MIN.pop();  
                            MIN.push(tmp);  
                        }  
                    }
                    else if(MAX.size() > MIN.size())  
                    {  
                        if(tmp.num > MAX.top().num)  
                            MIN.push(tmp);  
                        else if(tmp.num < MAX.top().num)  
                        {  
                            MIN.push(MAX.top());  
                            MAX.pop();  
                            MAX.push(tmp);  
                        }  
                    } 
                }  
                else if(strcmp(command,"Query")==0)  
                {  
                    if(MAX.size() == MIN.size())  
                        printf("No one!
    ");  
                    else   
                    {  
                        printf("%s
    ",MAX.top().name.c_str());  
                    }  
                }  
                else if(strcmp(command,"End")==0)  
                {  
                    if(MAX.size() == MIN.size())  
                        printf("Happy BG meeting!!
    ");  
                    else printf("%s is so poor.
    ",MAX.top().name.c_str());  
                    break;  
                }  
    		}
    		if(M != 0)
    			printf("
    ");
        }
    	return 0;
    }  
    
  • 相关阅读:
    后台向前台输出 换行“ ”
    Razor视图引擎输出没有编码的 Html 字符串
    C#之delegate
    C#之Action
    What's New in C# 6.0
    Git 放弃修改
    Spring.Net+Nhibernate
    nmap扫描ip段
    nginx多个if条件并且查询
    查看哪些redis命令拖慢了redis
  • 原文地址:https://www.cnblogs.com/sysu-blackbear/p/3237868.html
Copyright © 2011-2022 走看看