解题报告 之 HDU5328 Problem Killer
Description
You are a "Problem Killer", you want to solve many problems.
Now you have
problems,
the
-th
problem's difficulty is represented by an integer 
(






).
For some strange reason, you must choose some integer
and
(





),
and solve the problems between the
-th
and the
-th,
and these problems' difficulties must form an AP (Arithmetic Progression) or a GP (Geometric Progression).
So how many problems can you solve at most?
You can find the definitions of AP and GP by the following links:
https://en.wikipedia.org/wiki/Arithmetic_progression
https://en.wikipedia.org/wiki/Geometric_progression
Now you have
problems,
the
-th
problem's difficulty is represented by an integer 
(






). For some strange reason, you must choose some integer
and
(





),
and solve the problems between the
-th
and the
-th,
and these problems' difficulties must form an AP (Arithmetic Progression) or a GP (Geometric Progression). So how many problems can you solve at most?
You can find the definitions of AP and GP by the following links:
https://en.wikipedia.org/wiki/Arithmetic_progression
https://en.wikipedia.org/wiki/Geometric_progression
Input
The first line contains a single integer
,
indicating the number of cases.
For each test case, the first line contains a single integer
,
the second line contains
integers 








.












,
indicating the number of cases. For each test case, the first line contains a single integer
,
the second line contains
integers 








. 











Output
For each test case, output one line with a single integer, representing the answer.
Sample Input
2 5 1 2 3 4 6 10 1 1 1 1 1 1 2 3 4 5
Sample Output
4 6
题目大意:给你一个数字序列,求其中 最长等差数列 和 最长等比数列 两者中更长者的长度。
分析:从左到右扫一遍,遇到无法继续接着构造等差/等比数列的数字就更新一下最大值,重新开始构造新的。注意重新开始构造不需要从上一个数列的第二个数字开始,因为没有意义,到了当前数字之后 差值/比例还是不一样;而是应该从上一个数列的最后一个作为起点,用新的差值/比例构造。
上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
int main()
{
int kase;
cin >> kase;
while(kase--)
{
int n;
scanf( "%d", &n );
int AP = INF;
double GP = INF;
int APnum = 2, GPnum = 2;
int APmax = 0, GPmax = 0;
int pre, now;
scanf( "%d", &pre );
if(n == 1)
{
printf( "1\n" );
continue;
}
for(int i = 1; i < n; i++)
{
scanf( "%d", &now );
int APtem = now - pre;
double GPtem = (double)now / pre;
if(AP != APtem)
{
APmax = max( APmax, APnum );
APnum = 2;
AP = APtem;
}
else
{
APnum++;
}
if(GP != GPtem)
{
GPmax = max( GPmax, GPnum );
GPnum = 2;
GP = GPtem;
}
else
{
GPnum++;
}
pre = now;
}
GPmax = max( GPmax, GPnum );
APmax = max( APmax, APnum );
printf( "%d\n", max( GPmax, APmax ) );
}
return 0;
}

本文详细解读了HDU5328ProblemKiller算法,介绍了问题背景、输入输出格式及解决方案。通过实例演示,展示了如何找到最长的等差数列或等比数列,最终输出最多可以解决的问题数量。
5771

被折叠的 条评论
为什么被折叠?



