Codeforces Round #600 (Div. 2)

B. Silly Mistake

题意
有一个公司,每天有 n 个员工进出,标号1~n。

公司对进入办公室有一些规定:

  • 每个员工每天最多只能进一次办公室。
  • 如果那天他没有进办公室的话,他就没有办法离开。
  • 每天开始和结束时,办公室都是空的(员工不能过夜)。

满足以上三个条件的事件序列被称为有效日。

现给你一个序列 a,序列 a表示了员工的出入情况,“k"代表员工k进入办公室,”-k"代表员工 k 出了办公室。 例如:
[2, -2, 3, -3]
就代表 2 号员工进入了办公室, 2 号员工出了办公室, 3 号员工进入了办公室, 3 号员工出了办公室。

问这个序列 a 是否可以分成若干天的序列,保证每天都是有效的序列,如果无法分配直接输出 -1 ,否则输出可分的天数 和 每天的元素个数。

思路
模拟题
首先考虑非法的情况:

  • 员工在一天进入多次
  • 进入的员工没有出来
  • 没有进员工,就要出员工

下面就来解决非法的情况:
记录序列 a 的前缀和,找出里面前缀和为 0 的情况
前缀和为 0 就说明当前元素到 上一个前缀和为 0 的元素之间的所有所有元素 在不重复的情况下 可以放在一天。

记录每个正数出现的的次数,把出现的次数和前缀和中0 的个数比较,当其次数大于前缀和中的0的时候,意味着 有一个员工多次的进入,有元素重复。

当前缀和小于 0 的时候,意味着有没有进员工,就要出员工的情况存在。

/***********************
*author:ccf
*source:Codeforces_600-B. Silly Mistake
*topic:
************************/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#define ll __int64
using namespace std;

const int N = 1e6 + 7;
int cas,n,cnt = 0;
ll a[N],s[N],</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值