CF 255C
比赛的时候一开始把这题读错题了,错了两次才发现,然后想了一会,题目要求的那个数列,其实就是第一种情况,全部相等的数,第二种情况两个不同的数 相互出现,第一种情况好解决,关键是求第二种情况。对于第二种情况只要枚举 n个数中任意两个数所组成的最大可能长度即可。那么就把相同的数的下标(i)分别保存在一个vector里面。然后枚举即可。比赛中最后5分钟提交。。因为某处是k-1写成了K。。跪了= =!!
[cpp]
#include <cmath>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
#include <stack>
#include <deque>
using namespace std;
typedef long long LL;
#define eps 10e-9
#define inf 0x3f3f3f3f
const int maxn = 5000;
int b[maxn],a[maxn],c[maxn];
vector<int > v[maxn];
int hash[1000100];
int main(){
int n; int len=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
if(!hash[ b[i] ]){
v[ ++len].push_back(i);
hash[ b[i] ]=len;
}
else{
int cur = hash[ b[i] ];
v[cur].push_back(i);
}
}
if(n==1){
printf("1\n");
return 0;
}
int ans=0;
for(int i=1;i<=len;i++){
if(v[i].size()>ans) ans=v[i].size();
} www.zzzyk.com
for(int i=1;i<=len;i++){
for(int j=i+1;j<=len;j++){
int k=0, l=0; int temp=1;
while(l<v[i].size()&&k<v[j].size()){
if(v[j][k]>v[i][l]){
temp++;
l++; k++; if(l==v[i].size()) break;
if(v[i][l]>v[j][k-1]) temp++;
else{
while(v[i][l]<v[j][k-1]&&l<v[i].size()){
l++;
}
if(l<v[i].size())
temp++;
}
}
else{
k++;
}
}
if(temp>ans) ans=temp;
}
}
printf("%d\n",ans);
return 0;
}
补充:软件开发 , C++ ,