CF1859B题解
neil021110 · · 题解
我的思路是: 先找到每组数据中所有元素的最小值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;
}
}