【暴力枚举】CF #661 Div.3 1399C Boats Competition

观察数据范围,可以用枚举的方法

  • 首先记录重量为 k 的人的数量,num[k]
  • 枚举体重和 i,判断哪个体重和对应的组合最多;范围是 2 ~ 2*n(1<=k<=n)
  • 枚举第一个人的重量 j,则第二个人的重量为 i - j ;
    min( num[j], num[i-j] ) 即为该情况下能凑出的最多的组合数
  • 对于每一种体重和都计算了2次,例如 min(num[1], num[3-1]) 和 min(num[2], num[3-2])
    则 cnt / 2 为该体重和下的组合数量
  • 对于每一种体重和的情况,ans取最大值
#include 
using namespace std;

int main()
{
    int T; scanf("%d", &T);
    while(T--){
        int n, k, num[101], ans=-1; scanf("%d", &n);
        memset(num, 0, sizeof(num));
        for(int i=0; i<n; i++) { scanf("%d", &k); num[k]++;}
        // 枚举体重和
        for(int i=2; i<=2*n; i++){
            int cnt=0;
            // 枚举第一个人的体重
            for(int j=1; j<=i; j++)
                cnt+=min(num[j], num[i-j]);
            ans=max(ans, cnt/2);
        }
        cout<<ans<<endl;
    }

    //system("pause");

    return 0;
}

你可能感兴趣的:(2020暑假补题记录)