Codeforces Coder-Strike 2014 (Div. 2) C: Online Meeting 来得最早走得最晚的leader

来源:互联网 发布:蛋白质组数据分析 编辑:程序博客网 时间:2024/05/15 20:45

原题链接:Codeforces 421C - Online Meeting (CSDN貌似抽了,不能加http的链接了,大家自行把链接头的https改成http吧。。)

题目大意:给定一部分连续的用户上下线log(注意,是一部分,不是全部),判断哪些人有可能是团队leader。判断的依据:在任何一个有人在线的时刻,某人都在线,则这个人就认为有可能是leader。log完全按照时间先后顺序来,且同一时刻没有两个人同时上线或下线,即不存在并发行为。

大致思路:首先,自始至终没有出现过的用户肯定在候选leader中。其次,需要找到log中实际最早到的人。最早到的人有两种情况:log中第一条记录的人、没有上线行为只有下线行为的人。所以可以使用一个变量first记录当前最早到的人,每遇到一个直接下线的人就更新一次first。然而这样记录下来的first不一定是候选leader,因为可能他下线之后仍有人上线,或者他下线的时候还有人在线,这两种情况都不符合题目给的判断依据,故不能加入候选leader中。

#include <cstdio>#include <cstring>#include <iostream>using namespace std;int arr[100005]; //记录用户的当前状态:0代表没有出现过、1代表在线、-1代表离线int main() {memset(arr,0,sizeof(arr));int first = -1; //当前认定最早到的人,可能是第一个人,也可能是没有上过线直接下线的人bool first_flag = false; //判断first是否是候选leaderint n, m, temp, sum=0;int countOn=0; //记录在线的总人数char ch;scanf("%d %d%*c", &n ,&m);for(int i=0; i<m; i++) {scanf("%c %d%*c", &ch, &temp);if(i==0) {first = temp;first_flag = true;}if(ch=='+') {if(temp!=first && arr[first]==-1) first_flag = false; //若当前认定最早到的人已经下线后,仍有其他人上线,则first不是候选人arr[temp] = 1;countOn++;}else {if(arr[temp]==1) countOn--; //若之前是在线的,现在下线,则将总在线人数-1if(temp != first && arr[temp]==0) { //若之前是潜水,现在下线,说明这个人来得比前面的人都早,更新firstfirst = temp;first_flag = true;}if(temp==first && countOn > 0) first_flag = false; //若当前认定最早到的人下线的时候还有人在线,则first不在候选人中arr[temp] = -1;}}if(first_flag) arr[first] = 0; for(int i=1; i<=n; i++) {if(arr[i]==0) sum++;}cout<<sum<<endl;for(int i=1; i<=n; i++) {if(arr[i]==0) cout<<i<<" ";}return 0;}

0 0
原创粉丝点击