C. Destrucción de matrices (pensamiento, multiset)

C. Destrucción de matrices

Significado del título: Dada una secuencia de números, hay 2 n 2n2 n número, pregunte si hayxxx, 使ai + aj = x (i! = j) a_i + a_j = x (i! = j)unyo+unj=x ( yo !=j ) . Luego establecemosx = max (ai, aj) x = max (a_i, a_j)X=m a x ( ayo,unj) , luego repita la operación anterior, cada número solo se puede usar una vez, y pregunte si hay un númeroxxx para que se seleccionen todos los números, si hay un orden de selección de salida.

Idea: El valor máximo debe ser uno de los primeros valores seleccionados, (una prueba simple: si se selecciona el segundo valor más grande por primera vez, entonces no se debe seleccionar el valor más grande). Luego, reiteraremos Dar otro número aj a_junjEncuentra xxx , en la segunda selección,x = x =X= El valor máximo, el segundo valor más grande, entonces vamos directamente al número restante para buscar otro valor, si existe, continuamos hasta que podamos seleccionar todos los números, si no existe, cambiamos un númeroaj a_junjReinicie el juicio hasta que se hayan enumerado todos los números.

Multiset multiset se utilizó en el proceso de selecciónm u l t i s e t , fácil de elegir.

Código de código 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;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45363113/article/details/113095472
Recomendado
Clasificación