CF1399-Codeforces Round #661 (Div. 3)-C. Boats Competition(暴力)

题目链接
题意:给定一个数字序列 w 1 , w 2 , … , w n ( 1 ≤ n ≤ 50 , 1 ≤ w i ≤ n ) w_1, w_2, \dots, w_n(1 \le n \le 50,1 \le w_i \le n) w1,w2,,wn(1n50,1win),从中挑选出和相等(和不确定)的二元组,问你最多能够组合出的二元组的数量。
思路:注意到n和 w i w_i wi都很小,故直接从 [ 2 , 2 ∗ n ] [2,2*n] [2,2n]枚举二元组的和 S S S,记录最大值即可。
AC代码:

#include
using namespace std;
#define ll long long
#define pb push_back
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define frep(i,a,b) for(int i=a;i>=b;i--)
const int N = 1E5+10;

int n,k,m,a[N],b[N],w[N];

int main()
{
	//freopen("1.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
    int t; cin>>t;
    while(t--)
    {
        cin>>n;
        ll ans=-1;
        for(int i=0;i<=2*n;i++) a[i]=0;
        for(int i=0;i<n;i++) cin>>w[i],a[w[i]]++;
        for(int i=2;i<=2*n;i++){
            ll sum=0;
            for(int j=1;j<=i;j++)
                sum+=min(a[j],a[i-j]);
            ans=max(ans,sum/2);
        }
        cout<<ans<<endl;
	}
	return 0;
}

你可能感兴趣的:(codeforces,算法)