2015 多校联赛 ——HDU5400(水)
2015-08-19 09:31
381 查看
Sample Input
5 2 -2
0 2 0 -2 0
5 2 3
2 3 3 3 3
Sample Output
12
5
求最多多少序列满足,前半部分满足d(j+1) = d(j)+d1,后半部分d(j+1)= d(j)+d2,或者只满足其中一个。
假设可以找出长度为x的序列,则有x-1 + x-2 + .... + 1种。所以从头到尾找一遍即可。
5 2 -2
0 2 0 -2 0
5 2 3
2 3 3 3 3
Sample Output
12
5
求最多多少序列满足,前半部分满足d(j+1) = d(j)+d1,后半部分d(j+1)= d(j)+d2,或者只满足其中一个。
假设可以找出长度为x的序列,则有x-1 + x-2 + .... + 1种。所以从头到尾找一遍即可。
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; int num[101000]; int sta[101000]; ll p(ll n) { return (1+n)*n/2; } int main() { int n, d1, d2; while(scanf("%d%d%d", &n, &d1, &d2)!=EOF) { scanf("%d", num+1); for(int i=2; i<=n; i++) { scanf("%d", num+i); if(num[i]==(num[i-1]+d1)) sta[i] = 1; else if(num[i]==(num[i-1]+d2)) sta[i] = 2; else sta[i] = 0; } // for(int i=1; i<=n; i++) printf("%d ", num[i]); // for(int i=1; i<=n; i++) printf("%d ", sta[i]); ll re = 0; int cur = 1; while(cur<=n) { int ccur = cur+1; bool flag = true; while(ccur<=n) { if(sta[ccur]==0) break; else if(sta[ccur]==1) ccur++; else if(sta[ccur]==2) { while(ccur<=n) { if(sta[ccur]==2) ccur++; else { flag = false; break; } } } if(!flag) break; } re += p(ccur-cur-1); if((ccur-cur)>1) cur = ccur - 1; else cur = ccur; if(ccur>n) break; } printf("%I64d\n", re+n); } return 0; }
相关文章推荐
- (一二四)tableView的多组数据展示和手动排序
- 2015 多校联赛 ——HDU5400(水)
- Unity 2D教程: 滚动,场景和音效
- (一二四)tableView的多组数据展示和手动排序
- 贪心思想
- fig
- SQL语言的发展
- 九度oj-1079-手机键盘
- 阿峥教你实现UITableView循环利用
- untiy使用小技巧
- Android 多线程-----AsyncTask详解(康小岱已读)
- aauto学习系列之<4>:基础语法2
- 26. PHP 文件打开/读取/读取
- 全球主要气象气候研究部门及其共享数据集介绍
- 正则表达式
- 递归思想
- 如何使用Google APIs和Google应用系统集成(7)----在里面JSON兑换XML数据处理,JSON数据包括违规XML数据规范:XML节点名称不支持号码Java解
- GUID
- 数据库增删改查例子
- exp,imp导入时用户名密码错误