当前位置: 代码迷 >> 综合 >> CF #661 Div3 1399C Boats Competition
  详细解决方案

CF #661 Div3 1399C Boats Competition

热度:32   发布时间:2024-02-07 10:26:12.0

暴力枚举

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

  • 首先记录重量为 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 <bits/stdc++.h>
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;
}
  相关解决方案