We don't wanna work! STL应用

https://acm.bnu.edu.cn/v3/problem_show.php?pid=52308

We don’t wanna work!
Input: Standard Input
Time Limit: See AtCoder
ACM is an organization of programming contests. The purpose of ACM does not matter to you.
The only important thing is that workstyles of ACM members are polarized: each member is
either a workhorse or an idle fellow.
Each member of ACM has a motivation level. The members are ranked by their motivation
levels: a member who has a higher motivation level is ranked higher. When several members
have the same value of motivation levels, the member who joined ACM later have a higher rank.
The top 20% highest ranked members work hard, and the other (80%) members never (!) work.
Note that if 20% of the number of ACM members is not an integer, its fraction part is rounded
down.
You, a manager of ACM, tried to know whether each member is a workhorse or an idle fellow to
manage ACM. Finally, you completed to evaluate motivation levels of all the current members.
However, your task is not accomplished yet because the members of ACM are dynamically
changed from day to day due to incoming and outgoing of members. So, you want to record
transitions of members from workhorses to idle fellows, and vice versa.
You are given a list of the current members of ACM and their motivation levels in chronological
order of their incoming date to ACM. You are also given a list of incoming/outgoing of members
in chronological order.
Your task is to write a program that computes changes of workstyles of ACM members.
Input
The first line of the input contains a single integer N (1 ≤ N ≤ 50,000) that means the number
of initial members of ACM. The (i + 1)-th line of the input contains a string si and an integer
ai (0 ≤ ai ≤ 105
), separated by a single space. si means the name of the i-th initial member
and ai means the motivation level of the i-th initial member. Each character of si
is an English
letter, and 1 ≤ |si
| ≤ 20. Note that those N lines are ordered in chronological order of incoming
dates to ACM of each member.
The (N + 2)-th line of the input contains a single integer M (1 ≤ M ≤ 20,000) that means the
number of changes of ACM members. The (N + 2 + j)-th line of the input contains information
of the j-th incoming/outgoing member. When the j-th information represents an incoming of a
member, the information is formatted as “+ tj bj”, where tj is the name of the incoming member
7and bj (0 ≤ bj ≤ 105
) is his motivation level. On the other hand, when the j-th information
represents an outgoing of a member, the information is formatted as “- tj”, where tj means the
name of the outgoing member. Each character of tj is an English letter, and 1 ≤ |tj| ≤ 20.
Note that uppercase letters and lowercase letters are distinguished. Note that those M lines are
ordered in chronological order of dates when each event happens.
No two incoming/outgoing events never happen at the same time. No two members have the
same name, but members who left ACM once may join ACM again.
Output
Print the log, a sequence of changes in chronological order. When each of the following four
changes happens, you should print a message corresponding to the type of the change as follows:
• Member name begins to work hard : “name is working hard now.”
• Member name begins to not work : “name is not working now.”
For each incoming/outgoing, changes happen in the following order:
1. Some member joins/leaves.
2. When a member joins, the member is added to either workhorses or idle fellows.
3. Some member may change from a workhorse to an idle fellow and vice versa. Note that
there are no cases such that two or more members change their workstyles at the same
time.
Sample Input 1
4
Durett 7
Gayles 3
Facenda 6
Daughtery 0
1
+ Mccourtney 2
Output for the Sample Input 1
Mccourtney is not working now.
Durett is working hard now.
8Initially, no member works because 4 ×20% < 1. When one member joins ACM, Durrett begins
to work hard.
Sample Input 2
3
Burdon 2
Orlin 8
Trumper 5
1
+ Lukaszewicz 7
Output for the Sample Input 2
Lukaszewicz is not working now.
No member works.
Sample Input 3
5
Andy 3
Bob 4
Cindy 10
David 1
Emile 1
3
+ Fred 10
- David
+ Gustav 3
Output for the Sample Input 3
Fred is working hard now.
Cindy is not working now.
Gustav is not working now.
9Sample Input 4
7
Laplant 5
Varnes 2
Warchal 7
Degregorio 3
Chalender 9
Rascon 5
Burdon 0
7
+ Mccarroll 1
- Chalender
+ Orlin 2
+ Chalender 1
+ Marnett 10
- Chalender
+ Chalender 0
Output for the Sample Input 4
Mccarroll is not working now.
Warchal is working hard now.
Orlin is not working now.
Chalender is not working now.
Marnett is working hard now.
Warchal is not working now.
Chalender is not working now.
Warchal is working hard now.
Some member may repeat incoming and outgoing.
Sample Input 5
4
Aoba 100
Yun 70
Hifumi 120
Hajime 50
2
- Yun
- Aoba

思路具体见代码

#include <iostream>
#include <cstdio>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;

typedef pair<int,int>pii;
set<pii>Y;//work hard
set<pii,greater<pii> >N;//no hard
map<string,int>M;
char name[100005][22];
int v[100005];

void no(char* s)
{
    printf("%s is not working now.\n", s);
}
void yes(char* s)
{
    printf("%s is working hard now.\n", s);
}
int main()
{
    int n,m;
    int tot;
    string s;
    while(scanf("%d",&n)!=-1)
    {
        Y.clear();N.clear();M.clear();
        tot=n;
        for(int i=1; i<=n; i++)
        {
            scanf("%s%d",name[i],&v[i]);
            s=name[i];
            M[s]=i;
            Y.insert(pii(v[i],i));
        }
        while(Y.size()>tot/5)
        {
            N.insert(*Y.begin());
            Y.erase(Y.begin());
        }
        scanf("%d",&m);
        for(int i=n+1; i<=n+m; i++)
        {
            char type[20];
            scanf("%s%s",type,name[i]);
            s=name[i];
            if(type[0]=='+')
            {
                scanf("%d",&v[i]);
                pii p=make_pair(v[i],i);
                M[s]=i;
                if((tot+1)/5==tot/5)//两种名额比例没有变
                {
                    if(Y.size()&&p>*Y.begin())//插入到yes队伍
                    {
                        yes(name[i]);
                        no(name[Y.begin()->second]);
                        N.insert(*Y.begin());
                        Y.erase(Y.begin());
                        Y.insert(p);
                    }
                    else//插入到no队伍
                    {
                        no(name[i]);
                        N.insert(p);
                    }
                }
                else//名额变动的话肯定是yes队伍人数+1
                {
                    if(p>*N.begin())//p进入yes
                    {
                        yes(name[i]);
                        Y.insert(p);
                    }
                    else//p进入no
                    {
                        no(name[i]);
                        yes(name[N.begin()->second]);
                        Y.insert(*N.begin());
                        N.erase(N.begin());
                        N.insert(p);
                    }
                }
                ++tot;
            }
            else
            {
                int id=M[s];
                pii p=make_pair(v[id],id);
                if(tot/5==(tot-1)/5)//比例不变
                {
                    if(Y.count(p))//从yes里走
                    {
                        yes(name[N.begin()->second]);
                        Y.insert(*N.begin());
                        N.erase(N.begin());
                        Y.erase(Y.find(p));
                    }
                    else//从no里走
                        N.erase(N.find(p));
                }
                else//yes总人数-1
                {
                    if (!Y.count(p))//从no里走
                    {
                        no(name[Y.begin()->second]);
                        N.insert(*Y.begin());
                        Y.erase(Y.begin());
                        N.erase(N.find(p));
                    }
                    else //从yes里走
                        Y.erase(Y.find(p));
                }
                --tot;
            }
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值