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

原题链接: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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值