【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 IO(二) 之 InputStream
源代码均以JDK1.8作为參考 前言: InputStream实现了两个接口Closeable和AutoCloseable: Closeable:JDK1.5中引入,Closeable接口中仅仅有一个 ...
- JS学习笔记-数据类型
最初的JS学习已经过去大半年的时间了,至此感觉对JS的使用与理解并非非常深入,因此在近期的工作之余也開始了新一轮的JS学习. 几天时间过去了,对于一些基础内容的学习还是非常有必要的,就从今天的又一次整 ...
- programming-challenges Shoemaker's Problem (110405) 题解
Greedy. 证明: Let's say we have job 1, 2, ..., n, and they have time and fine as t1, f1, t2, f2, ..., ...
- 实习第四天(bboss框架学习)
现在好像比较使用的管理工具是gradle管理工具,学长说这个管理工具比maven管理工具要好用! 我今天主要就是想要安装好的gradle这个管理工具,但是可能是我的eclispe版本的问题,我没能安装 ...
- css实现上下左右布局
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 最短路径----SPFA算法
求最短路径的算法有许多种,除了排序外,恐怕是ACM界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra,接着是Bellman-Ford,它们都可以求出由一个源点向其他各点的最短路径:如果我们 ...
- json数据字典,以及数据在下拉框中显示
建立person_vocation.json数据字典文件,内容: [ {"id":1,"disabled":false,"selected" ...
- 范型在java中的应用
根据泛型在java中的不同位置,大致可以分为类泛型.方法泛型和接口泛型.以下三个Demo基本展现三种泛型的用法,其中接口泛型又分两种情况描述.类泛型和方法泛型 import java.util.Arr ...
- 《剑指offer》二维数组中的查找
一.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 二.输入描述 ar ...
- 原生js实现发送验证码
var form = { myfun:function(){ var el = form.config().el; var button = form.config().button; var tim ...