C. Destruction de matrice (pensée, multiset)

C. Destruction des baies

Signification du titre: Étant donné une suite de nombres, il y a 2 n 2n2 n nombre, demandez s'il y a unxxx, 使ai + aj = x (i! = j) a_i + a_j = x (i! = j)uneJe+unej=x ( je !=j ) . On pose alorsx = max (ai, aj) x = max (a_i, a_j)X=m a x ( aJe,unej) , puis répétez l'opération précédente, chaque numéro ne peut être utilisé qu'une seule fois, et demandez s'il y a un nombrexxx pour que tous les nombres soient sélectionnés, s'il existe un ordre de sélection de sortie.

Idée: La valeur maximale doit être l'une des premières valeurs sélectionnées, (une simple preuve: si la deuxième plus grande valeur est sélectionnée pour la première fois, alors la plus grande valeur ne doit pas être sélectionnée.) Ensuite, nous réitérerons Donner un autre nombre aj un JunejTrouver xxx , dans la deuxième sélection,x = x =X= La valeur maximale, la deuxième plus grande valeur, donc nous allons directement au nombre restant pour trouver une autre valeur, si elle existe, continuez jusqu'à ce que nous puissions sélectionner tous les nombres, si elle n'existe pas, changer un nombreaj a_junejRelancez le jugement jusqu'à ce que tous les nombres aient été énumérés.

Multiset Le multiset a été utilisé dans le processus de sélectionm u l t i s e t , facile à choisir.

Code C ode C o d e

#include<bits/stdc++.h>
using namespace std;
vector<int> a;
//对于每种 第一次选择判断是否是可以成功的。
vector<int> check(vector<int> xt, int u, int n) {
    
    
    multiset<int> s;
    vector<int> ans;
    for(auto it:x) s.insert(it);
    for(int i=0; i<n; i++) {
    
    //n次选择。
        
        auto it1 = s.end();
        it1--;//当前最大值。
        int y = u-*it1;//另一个数。
        s.erase(it1);
        auto it2 = s.find(y);
        if(it2 == s.end()) return {
    
    };//选择失败,返回空数组。
        //把选择顺序加入数组中。
        ans.push_back(y);
        ans.push_back(u-y);
        u = max(y, u-y);
        s.erase(it2);
        
    }
    return ans;
}

int main() {
    
    
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    int t;
    cin >> t;
    while(t--) {
    
    
        int n, x, flag = 0;
        cin >> n;
        for(int i=0; i<2*n; i++) {
    
    
            cin >> x;
            a.push_back(x);
        }
        sort(a.begin(), a.end());
        for(int i=0; i<2*n-1; i++) {
    
    //枚举每个a_j
            
            int k = a[i] + a[a.size()-1];
            vector<int> v = check(a, k, n);
  			//选择成功
            if(v.size()) {
    
    
                printf("Yes\n%d\n", k);
                for(int j=0; j<n; j++) {
    
    
                    printf("%d %d\n", v[j*2], v[j*2+1]);
                }
                flag = 1;
                break;
            }
            
        }
        if(!flag) printf("No\n");
        a.clear();
    }
    return 0;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45363113/article/details/113095472
conseillé
Classement