其他分享
首页 > 其他分享> > CF1121B Mike and Children 题解

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​ 是否被之前标记过,如果被标记过,那么说明这个答案珂行,把当前答案加一,最后统计最大值即可。

注意以下两点:

#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