链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
出题人不喜欢数学,所以他决定把这个问题抛给你。
对于一个数组的连续的区间(l,r),如果max(al,al+1,...,ar)=gcd(al,al+1,...,ar),则称这个区间为好区间。
他将给你一个数组,需要求出数组中最长的好区间的长度。
max(al,al+1,...,ar)表示区间(l,r)中的最大元素,gcd(al,al+1,...,ar)表示区间(l,r)中所有元素的最大公因数。
特别的,规定区间的长度为1的max(ai)等于ai本身,区间的长度为1的gcd(ai)等于ai本身。
输入描述:
第一行包含一个整数T(1≤T≤104),代表样例数量。
接下来为T组样例。每组样例的第一行为一个整数n(1≤n≤5⋅1e5),表述数组的长度。
每组样例的第二行包含n个整数a1,a2,...,an(1≤ai≤1e9),表示他给你的数组。
保证所有样例的n的和不超过5*1e5
输出描述:
对于每个样例,输出一个整数ans表示最长的好区间的长度。
示例1
输入
2 2 1 2 2 2 3
输出
复制1 1
1 1
说明
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int a[N];
int main(){
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int res=0;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;)
{
int u=0;
int j=0;
for(j=i;j<=n;j++)
{
if(a[i]==a[j])
u++;
else break;
}
i=j;
res=max(res,u);
}
cout<<res<<endl;
}
return 0;
}
浅浅的说个思路:
他定义的好区间是某个区间的最大公约数和这个区间中的最大值相同
先用两个数的最大共约数来举例,假如两个数a和b不相等,而他们两个的最大公约数最好的情况就是两个数中最小的那个。
而现在要求寻找一个区间内的最大公约数,那么找到的最大公约数最好的情况便是这个区间中最小的那个数,
而且还要满足这个区间的最大值等于这个区间的最大公约数
刚刚已经分析了最大公约数最好的情况便是等于区间中最小的那个数,那么什么情况下才能满足区间中最小的数等于最大的数呢
那么答案显而易见,不难看出,只有这个区间的数均是相等的情况下才满足这样条件,所以所谓的好区间便是一个值相同的区间,所以这个题便是要求寻找长度最长的数值相同的区间,那么便优化成了一个很简单的题,代码如上。