CF1121B Mike and Children 题解
作者:互联网
题意翻译十分简洁,我说几点需要注意的。
最多能选几个数?
这是错的,要给出最多选出几对数。
现在我们就珂以开始了。
我的做法理论时间复杂度是 O(n^3)O(n3) 的暴力,但是因为常数较小于是珂以通过。
首先我们观察发现 a_iai 的范围很小,只有 10^5105 于是我们把给出的数标记一下。
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),vis[a[i]]=1;
//标记一下a[i]方便后面查找
然后枚举任意两个数,得到一个和 a_i+a_j(i\not=j)ai+aj(i=j) 再循环一次,判断 a_i+a_j-a_kai+aj−ak 是否被之前标记过,如果被标记过,那么说明这个答案珂行,把当前答案加一,最后统计最大值即可。
注意以下两点:
-
防止数组越界,当 (a_i+a_j-a_k)<1(ai+aj−ak)<1 时直接跳过。
-
最后答案两两统计过,所以答案要除以二。
#include<cstdio>
#include<algorithm>
#define N 1919810
using namespace std;
int n,a[N],l,r,ans;
bool vis[N];
signed main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]),vis[a[i]]=1;
for(int ii=1;ii<=n;ii++){
for(int jj=ii+1;jj<=n;jj++){
int v=a[ii]+a[jj],cnt=0;
for(int i=1;i<=n;i++){
if(v-a[i]<=0)continue;
if(vis[v-a[i]])cnt++;
}
cnt/=2;
ans=max(ans,cnt);
}
}
printf("%d",ans);
return 0;
}
标签:Mike,标记,int,题解,scanf,aj,答案,include,Children 来源: https://www.cnblogs.com/masida-hall-LZ/p/16623834.html