标签:Mike 标记 int 题解 scanf aj 答案 include 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。