CF1859B题解

· · 题解

我的思路是: 先找到每组数据中所有元素的最小值mi,再将mi移动到第二小值最小的数组中,再将每个数组中的最小值移动到包含mi的数组中,再求每个数组的最小值之和(当时为mi+除第二小值最小之外各个数组的第二小值的和)

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int m1[n],m2[n],mi=1999999999;//m1为每个数组的最小值,m2为每个数组的第二小值,mi为所有数组的最小值
        for(int i=0;i<n;i++){
            int m;
            cin>>m;
            for(int j=0;j<m;j++){
                int a;
                cin>>a;
                if(j==0){//当输入第一个时,该数为当前数组最小值
                    m1[i]=a;
                }else if(a<m1[i]){//当输入值小于最小值时,最小值变为第二小值,最小值更新为输入值
                    m2[i]=m1[i];
                    m1[i]=a;
                }else if(j==1||a<m2[i]){//当输入值大于等于最小值,小于第二小值或输入第二个时,第二小值更新为输入值
                    m2[i]=a;
                }
                if(a<mi)mi=a;
            }
        }
        sort(m2,m2+n);//将所有数组的第二小值排序并排除最小的将以mi代替
        long long sum=mi;
        for(int i=1;i<n;i++){
            sum+=m2[i];
        }
        cout<<sum<<endl;
    }
}