#10776. 搜索算法(NOIP2009)寻找等差数列
搜索算法(NOIP2009)寻找等差数列
(NOIP2009)寻找等差数列
有一些长度相等的等差数列(数列中每个数都为0~59的整数),设长度均为L,将等差数列中的所有数打乱顺序放在一起。现在给你这些打乱后的数,问原先L最大可能为多大?先读入一个数n(1≤n≤60),再读入n个数,代表打乱后的数。输出等差数列最大可能长度L。
#include<iostream>
#include<cstring>
using namespace std;
int hash[60];
int n,x,ans,maxnum;
int work(int now){
int first,second,delta,i;
int ok;
while(① && !hash[now])
++now;
if(now>maxnum)
return 1;
first=now;
for(second=first;second<=maxnum;second++)
if(hash[second]){
delta=②;
if(first+delta*(③)>maxnum)
break;
if(delta==0)
ok=(④);
else{
ok=1;
for(i=0;i<ans;i++)
ok=⑤ && (hash[first+delta*i]);
}
if(ok){
for(i=0;i<ans;i++)
hash[first+delta*i]--;
if(work(first))
return 1;
for(i=0;i<ans;i++)
hash[first+delta*i]++;
}
}
return 0;
}
int main(){
int i;
memset(hash,0,sizeof(hash));
cin>>n;
maxnum=0;
for(i=0;i<n;i++){
cin>>x;
hash[x]++;
if(x>maxnum)
maxnum=x;
}
for(ans=n;ans>=1;ans--)
if(n%ans==0 && ⑥){
cout<<ans<<endl;
break;
}
return 0;
}
①处应填( )。
{{ select(1) }}
- now<maxnum
- now>=maxnum
- now<=maxnum
- now>maxnum
②处应填( )。
{{ select(2) }}
- second-first
- second
- first-second
- second-ans
③处应填( )。
{{ select(3) }}
- ans-1
- ans-delta
- ans
- ans-first
④处应填( )。
{{ select(4) }}
- hash[first]>ans
- hash[first]=ans
- hash[second]<=ans
- hash[second]<ans
⑤处应填( )。
{{ select(5) }}
- 0
- (!ok)
- 1
- ok
⑥处应填( )。
{{ select(6) }}
- work(0)
- work(0)<=0
- work(ans)
- (!work(ans))