Gym 101775J Straight Master(差分数组)
题意:
给你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)刚好打完。
思路
-
首先将数组进行差分获得差分数组
ca[i]为正 就相当于以 i 为起点的区间有ca[i]个。
ca[i]为负 就相当于以 i 为终点的区间有ca[i]个。 -
对于区间长度如何控制呢?
可以发现使用3,4,5三个数字可以组成 。
所以对于区间起点可以与>3的终点去任意组合。如果起点和终点能够完全对应上,那么就是YES,否则就是NO。
注意:如果差分数组中前两个为负数,那么就是NO。
代码
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int, int> const int N =2e5 + 5; const int M=1000000007; int n,m,k; int TT=1; int a[N]; int ca[N]; void slove() { cin>>n; int flag=1; for(int i=1;i<=n;i++){ cin>>a[i]; } a[++n] = 0; for(int i=1;i<=n;i++) ca[i]=a[i]-a[i-1]; int sum=0; for(int i=1;i<=n;i++){ if(ca[i]>0) sum+=ca[i]; if(ca[i+3]<0 && i+3<=n) sum+=ca[i+3]; if(sum<0) break; } // cout<<sum<<endl; if(ca[1]<0||ca[2]<0) sum=-1; string ans; if(sum==0) ans="Yes"; else ans="No"; cout<<"Case #"<<TT++<<": " << ans<<endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; cin >> t; while (t--) slove(); return 0; }
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/16637454.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步