题解 CF1121B【 Mike and Children】

Rbu_nas

2019-03-11 22:43:50

Solution

**题意简述** 长度为$n$的序列$a$中,满足$a_i+a_j = a_k+a_m(i≠j≠k≠m)$性质个数的最大值 $ $ 一道简单的模拟qwq,结合样例解释差不多就出来了。 首先用类似于桶的思想,把能达到$a_i+a_j(i+1≤j≤n)$值的个数记录下来,然后再循环遍历这个桶,最大的次数即为最大值 可能唯一的难点在循环变量取值吧233,因为$a_i+a_j$ 是不断往后推的,所以每次$j$从$i+1$开始,感性理解一下就能明白 具体细节见代码 $ $ ```cpp #include <cstdio> #include <algorithm> using namespace std; #define gcc getchar template <typename T> inline void read(T&x) { x=0; bool f=true; char ck=gcc(); for( ; ck<'0'||ck>'9'; ck=gcc()) if(ck == '-') f=false; for( ; ck>='0'&&ck<='9'; ck=gcc()) x=(x<<1)+(x<<3)+(ck^48); x=f?x:-x; return ; } #define N 1003 #define M 200003 int n, res, a[N], flag[M]; int main(void) { read(n); for(int i=1; i<=n; ++i) read(a[i]); for(int i=1; i<=n; ++i) for(int j=i+1; j<=n; ++j) ++flag[a[i]+a[j]]; //更新ai+aj的值的次数 for(int i=1; i<=M; ++i) res=max(res, flag[i]); //取相同值的最大次数 printf("%d", res); return 0; } ```