【Henu ACM Round #13 F】Fibonacci-ish
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
枚举序列的头两个数字是什么
O(N^2)
然后头两个数字确定之后。
f[3],f[4]..就确定了
只需查看f[3],f[4]..是不是存在就好了。
但是这样复杂度看起来是O(N^3)的了。
其实不然,a[n] = a[n-1]+a[n-2]这个递推的增长速度是接近2^n的增长速度的。
(所以到达10^9之后直接break就好了
所以实际上不会真的达到递推1000的规模
差不多只有O(N^2*100)的样子。
这是可以接受的了。
->但是有一种情况要特判,就是f[1] = f[2]=0的情况。这种情况直接统计1的个数即可。
程序中还加了一个优化。
因为前两项f1,f2确定之后f[i] = xf1+yf2
则我们提前算出来系数。
就能直接得到前两项是f1,f2的前提下fi的值了
根据这个可以做一下剪枝。
【代码】
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int a[N+10],n,b[N+10];
map<int,int> dic;
int x[N+10],y[N+10];
int main(){
#ifdef LOCAL_DEFINE
freopen("rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
x[1] = 1;y[1] = 0;
x[2] = 0;y[2] = 1;
x[3] = y[3]= 1;
for (int i = 4;i <=N;i++){
x[i] = x[i-2]+x[i-1];
y[i] = y[i-2]+y[i-1];
}
cin >> n;
for (int i = 1;i <= n;i++) {
cin >> a[i];
dic[a[i]]++;
}
int ans = 2;
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
if (i!=j){
if (a[i]==0 && a[j]==0){
int num = dic[0];
ans = max(ans,num);
continue;
}
dic[a[i]]--,dic[a[j]]--;
int num = 2;
b[1] = a[i],b[2] = a[j];
if (ans>2 && ans<=40){
long long temp = 1LL*x[ans]*a[i]+1LL*y[ans]*a[j];
if (abs(temp)>1e9|| dic[temp]==0){
dic[a[i]]++,dic[a[j]]++;
continue;
}
}
for (int k = 3;k<=n;k++){
b[k] = b[k-2]+b[k-1];
if (abs(b[k])>1e9) break;
if (dic[b[k]]>0){
dic[b[k]]--;
num++;
}else break;
}
ans =max(ans,num);
for (int k = 1;k <= num;k++) dic[b[k]]++;
}
cout << ans << endl;
return 0;
}
【Henu ACM Round #13 F】Fibonacci-ish的更多相关文章
- 【Henu ACM Round#16 F】Om Nom and Necklace
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] KMP算法可以把"i前缀"pre[i] 分成ssssst的形式 这里t是s的前缀. 然后s其实就是pre[i]中 ...
- 【Henu ACM Round#17 F】Upgrading Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果我们对某一个位置i操作两次的话. 显然结果就和操作一次一样. 因为第一次操作过后1..i这些数字就变成是互质的了. gcd为1. ...
- 【Henu ACM Round#15 F】Arthur and Questions
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] a1+a2+...+ak<a2+a3+...ak+1 ->a1<ak+1 a2+a3+...+ak+1<a3 ...
- 【Henu ACM Round#18 F】Arthur and Walls
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...
- 【Henu ACM Round#20 F】 Arthur and Brackets
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 所给的li,ri是左括号从左到右的顺序给的. (且注意长度是2*n 现在我们先把第一个左括号放在第1个位置. 然后考虑第二个位置. ...
- 【Henu ACM Round#19 F】Dispute
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 这一题和这一题很像 (链接 ) 会发现如果a[i]!=b[i]那么就按下i就好了. 然后改变和他相邻的点. 此后a[i]再也不可能和 ...
- 【Henu ACM Round#14 F】 President and Roads
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 处理出起点到任意点的最短路以及最短路条数=>dis[0][i],cnt[0][i] 然后 把所有的边反向 处理出在反图上终点到 ...
- 【Henu ACM Round #13 E】Spy Syndrome 2
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 对m个串建立一棵字典树. 然后对主串. 尝试从第一个位置开始.在字典树中尝试匹配 如果匹配到了位置i 就再从位置i+1开始尝试匹配 ...
- 【Henu ACM Round #13 D】A Trivial Problem
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 123...n中末尾0的个数 只会由素因子2和5的个数决定且等于 Min{cnt[2],cnt[5]} 且素因子2的个数一定会比5多 ...
随机推荐
- 黑马程序猿-----Java之你不得不知道的排序
------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...
- Mysql锁表
lock tables是线程锁定表 lock tables table_name read lock tables table_name write read表示 所有用户只能读取被锁的表,不能对其进 ...
- List methods
Python provides methods that operate on lists. For example, append adds a new element to the end of ...
- 区间dp学习笔记
怎么办,膜你赛要挂惨了,下午我还在学区间\(dp\)! 不管怎么样,计划不能打乱\(4\)不\(4\).. 区间dp 模板 为啥我一开始就先弄模板呢?因为这东西看模板就能看懂... for(int i ...
- ScrollView嵌套GridView不显示顶部
/* * scrollView中嵌套GridView不能显示头部 * * 方案①:scrollView.smoothScrollTo(0, 0); * * ...
- LINQ返回DataTable类型 list转dataset 转换为JSON对象
using System.Web.Script.Serialization; using System.Collections.Generic; using System.Reflection; us ...
- EasyUI 之 DataGrid利用用拉姆达表达式实现分页查询
首先,我们在DataGrid的URL中加上我们要查询的条件:查询用户名不是“呵呵”的所有用户. <div> <table id="dg" class=&quo ...
- UVa 208 Firetruck【回溯】
题意:给出一个n个节点的无向图,以及某个节点k,按照字典序从小到大输出从节点1到节点k的所有路径 看的题解 http://blog.csdn.net/hcbbt/article/details/975 ...
- react 中间件相关的一些源码解析
零.随便说说中间件 在react的使用中,我们可以将数据放到redux,甚至将一些数据相关的业务逻辑放到redux,这样可以简化我们组件,也更方便组件抽离.封装.复用,只是redux不能很好的处理异步 ...
- mysql每个表总的索引大小
/* 指定的数据库 每个表的索引 不包含主键索引的大小*/ ,),,),'mb') as index_size from information_schema.tables where TABLE_S ...