您的位置:首页 > 编程语言 > Go语言

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

2014-04-23 11:50 309 查看
原题链接: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是否是候选leader
int 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--; //若之前是在线的,现在下线,则将总在线人数-1
if(temp != first && arr[temp]==0) { //若之前是潜水,现在下线,说明这个人来得比前面的人都早,更新first
first = 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm ACM codeforces