博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gym 101775J Straight Master(差分数组)题解
阅读量:5949 次
发布时间:2019-06-19

本文共 1310 字,大约阅读时间需要 4 分钟。

题意:给你n个高度,再给你1~n每种高度的数量,已知高度连续的3~5个能消去,问你所给的情况能否全部消去;例:n = 4,给出序列1 2 2 1表示高度1的1个,高度2的2个,高度3的2个,高度4的1个。那么我打出1 1 1(高度1 2 3),1 1 1(高度2 3 4)刚好打完。

思路:对于差分数组我们知道,如果我们对区间L,R加1,那么d[L] += 1, d[R + 1] -= 1,我们可以想象这个序列是由0序列不断进行区间+1操作得到。我们打出差分数组,从左到右遍历,如果遇到正数,那么我们就往右找负数把他消掉,如果这个负数和正数距离小于3那么显然无法构成,其他都可以(大于5时我们可以证出这个距离可以用3 4 5表示);如果遇到负数显然没有正数和他匹配,也不行。

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
typedef long long ll;using namespace std;const int maxn = 200000 + 10;const int seed = 131;const ll MOD = 1e9 + 7;const int INF = 0x3f3f3f3f;ll a[maxn], d[maxn];int main(){ int T, n, Case = 1; scanf("%d", &T); while(T--){ scanf("%d", &n); a[0] = 0; for(int i = 1; i <= n; i++){ scanf("%lld", &a[i]); d[i] = a[i] - a[i - 1]; } d[n + 1] = -a[n]; int flag = 0; int j = 2; for(int i = 1; i <= n; i++){ if(d[i] < 0) flag = 1; while(j <= n + 1 && d[i] > 0){ if(d[j] < 0){ if(j - i < 3) flag = 1; if(d[j] + d[i] < 0){ d[j] += d[i]; d[i] = 0; } else{ d[i] += d[j]; d[j] = 0; j++; } } else j++; } if(d[i] > 0) flag = 1; if(flag) break; } printf("Case #%d: ", Case++); if(flag) printf("No\n"); else printf("Yes\n"); } return 0;}

 

转载于:https://www.cnblogs.com/KirinSB/p/10010010.html

你可能感兴趣的文章
Samba共享服务器的搭建
查看>>
linux系统管理---账号与权限管理
查看>>
我的友情链接
查看>>
Android Target unknown and state offline
查看>>
润乾报表使用EXCEL数据源的方法及改进
查看>>
java并发编程基础
查看>>
我的DOS命令路径定义错了
查看>>
应用SELinux中的目标策略限制进程运行
查看>>
html5页面点击和左右滑动页面滚动
查看>>
SimpleDateFormat 的使用注意点(线程安全问题)
查看>>
Vmware11安装debian8
查看>>
事情的两面性
查看>>
Servlet中报Cannot forward after response has been committed错
查看>>
Maven发布项目
查看>>
MyEclipse配置lombok
查看>>
医院财务管理内容摘要
查看>>
相关链接
查看>>
使用Eclipse编写Python代码(又名Eclipse的使用)
查看>>
10种常见网管错误 你有过吗?你有遇到过嘛?
查看>>
通过组策略开启客户端远程桌面
查看>>