zoukankan      html  css  js  c++  java
  • 题解 CF1399C 【Boats Competition】

    题目描述:

    给出每个人的质量,要求两人一组分组,每组两人的重量和与其他组的重量和相等,求最多能分多少组。

    输入描述:

    第1行:t(1 (leq) t (leq) 1000)。表示测试的个数。
    第2行:n(1 (leq) n (leq) 50)。第一个测试中参赛者的个数。
    第3行:n个数字组成的数组w。表示n位参赛者的重量。(1 (leq) (w_i) (leq) n)
    剩下的t-1个测试依此类推。

    输出描述:

    对于每个测试用例,打印一个整数k。k表示在每个测试用例中分的最多组的个数。

    题目链接:https://www.luogu.com.cn/problem/CF1399C

    思路:由于题目的数据范围比较小,可以使用暴力做法。不过直接通过遍历数组w很难下手,这时候需要考虑'执果索引'。即通过遍历每组中两个人的质量和的所有可能来求解。
    (也就是我们通常说的正着想不出来思路可以考虑一下倒着想)。
    代码如下:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int t,n,x;
        cin>>t;
        while(t--)
        {
            cin>>n;
            vector<int> cnt(n+1);
            for(int i=1;i<=n;i++)
            {
                cin>>x;
                ++cnt[x];
            }
            int k=2*n,ans=0,res=0;
            for(int s=2;s<=k;s++)
            {
                for(int i=1;i<(s+1)/2;i++)
                {
                    if(s-i>n)
                       continue;
                    ans+=min(cnt[i],cnt[s-i]);
                }
                if(s%2==0) ans+=cnt[s/2]/2;
                res=max(res,ans);
                ans=0;
            }
            cout<<res<<endl;
        }
    }
    
  • 相关阅读:
    面向对象
    原型链
    HTTP协议
    java连接数据库(jdbc)调用配置文件
    MySQL-学习笔记
    JAVA-集合框架
    JAVA-多线程
    java中的try-catch-finally异常处理(学习笔记)
    ADO.NET增、删、改、查
    C#资源管理器
  • 原文地址:https://www.cnblogs.com/Acapplella/p/13446090.html
Copyright © 2011-2022 走看看