• Array Destruction


    题意

      给出一个长为2n的序列,你需要设定一个数x,每一次你可以选择序列中的两个数a和b,满足a+b等于x,然后将ab从序列中去除,最后将x变为a和b较大的那个数。如果可以把序列全部消空,输出yes和最开始的x,然后输出每一步选择的两个数。否则输出no。

    思路

      我们可以知道的是每一步的两个数里面一定有当前序列中的最大值,因为这一步消除不了它,那么在接下来的步骤中都消除不了了(下一步的x比它小)。

      那么在最开始的阶段,已经确定有一个数是最大值,那么另一个数就是其余2n-1种情况

      所以我们其余2n-1个每个都试试就行,这里使用multset会非常舒服

    AC代码

    #include<iostream>
    #include<set>
    #include<vector>
    #include<algorithm>
    using namespace std;
    int t,n;
    
    vector<int> check(int n,vector<int> a,int x){
        multiset<int> s;
        for(auto e : a)
            s.insert(e);
        vector<int> res;
        
        for(int i=0;i<n;i++){
            auto r = s.end();
            r--;
            int y = x - *r;
            s.erase(r);
            auto l = s.find(y);
            if(l == s.end()) return {};
            res.push_back(y);
            res.push_back(x-y);
            x = max(x-y,y);
            s.erase(l);
        }
        return res;
    }
    
    int main(){
        cin>>t;
        while(t--){
            cin>>n;
            vector<int> a(2*n);
            for(int i=0;i<2*n;i++)
                cin>>a[i];
            sort(a.begin(),a.end());
            
            int flag=0;
            for(int i=0;i<2*n-1;i++){
                int x=a[i]+a[2*n-1];
                vector<int> res = check(n,a,x);
                if(res.size()){
                    cout<<"YES
    ";
                    cout<<x<<'
    ';
                    for(int j=0;j<n;j++){
                        cout<<res[2*j]<<" "<<res[2*j+1]<<'
    ';
                    }
                    flag=1;
                    break;
                }
            }
            if(flag==0) cout<<"NO
    ";
        }
        return 0;
    } 
    一点一点积累,一点一点蜕变!
  • 相关阅读:
    LR--用栈实现移进--归约分析(demo)
    阿里云ECS服务器socket无法连接的问题
    select客户端模型封装——回调方式快速建立客户端
    select服务器端模型封装——回调方式快速建立服务端
    python实现的ocr接口
    汉字字典树
    linux下简易端口扫描器
    Linux下cs简单通讯(socket)
    POj 1321 棋盘问题 DFS 回溯
    HDU 1097 快速幂
  • 原文地址:https://www.cnblogs.com/qq2210446939/p/14317227.html
Copyright © 2020-2023  润新知