题意:给出N种类的数量,求是否可以把N种牌按3-5张连续的顺子打出,顺子必须连续.

分析:相当于把这个序列分成若干长度为[3,5]的区间,当然其实分成若干段大于3的区间即可.因为大于5的区间又可以分拆成若干段长度为[3,5]的区间.

令\(b[i] = a[i] - a[i-1]\), 则\(b[i] >0\) 表示有\(b[i]\)段区间以此为起点, \(b[i] < 0\)表示有\(|b[i]|\)段区间以\(i-1\)为终点. 那么对于每个区间的起点i,必须在i+3开始的位置一直向后寻找终点,且起点和终点必须数量相等,若不相等则不能打出顺子.

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 2e5+5;
LL a[MAXN], b[MAXN];
int N; bool check()
{
LL sum = 0;
if(b[2] <0 || b[3]<0) return false;
for(int i=1;i<=N+1;++i){
int p = i + 3;
if(b[i] > 0) sum += b[i];
if(p > N+1) break;
if(b[p]<0 ){
sum += b[p];
b[p] = 0;
}
if(sum<0) break;
}
if(sum !=0) return false;
return true;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int T,cas=1; scanf("%d",&T);
while(T--){
scanf("%d", &N);
for(int i=1;i<=N;++i){
scanf("%lld", &a[i]);
b[i] = a[i] - a[i-1];
}
b[N+1] = -a[N]; printf("Case #%d: ",cas++);
if(check()) printf("Yes\n");
else printf("No\n");
}
return 0;
}

最新文章

  1. Datatables JQuery插件
  2. 抽象工厂模式 shiyanlou
  3. UIView动画效果
  4. Google 开源项目风格指南
  5. sql如何获取一个时间段内的月份
  6. Oracle查询出最最近一次的一条记录
  7. python自省指南
  8. [AngularJS] Sane, scalable Angular apps are tricky, but not impossible.
  9. shell变量自增的几种方式
  10. Java 之 StringTokenizer
  11. MongoDB Error
  12. RAC下一个Fatal NI connect error 12170.错误处理
  13. centos 7 切换运行模式
  14. Python执行系统命令:使用subprocess的Popen函数
  15. https 自签名SSL证书
  16. StringBuilder and StringBuffer
  17. CLion之C++框架篇-优化框架,引入boost(三)
  18. 第3章 Linux上文件的权限管理
  19. 把旧系统迁移到.Net Core 2.0 日记 (16) --Cors跨域访问
  20. MySQL数据库----流程控制

热门文章

  1. 如何在ChemDraw中打出符号π
  2. UVA 548(二叉树重建与遍历)
  3. ios 开发之 -- UILabel的text竖行显示
  4. python中的coding的格式书写形式
  5. 【BZOJ4071】[Apio2015]巴邻旁之桥 Treap
  6. 前端开发 - CSS - 上
  7. MySQL数据库(二)
  8. 爬虫之cookiejar模块
  9. mysql参照完整性 策略设置之 on update 和 on delete
  10. NSUserDefaults保存对象数组报错