B. Chips on the Board
题意:保证在n*n的棋盘上对于每一个点的列或者行都有一个筹码,也可以两个都有,问最小筹码:对于每一个筹码计算:a[i]+b[i];
要使每个点都满足,最少的筹码的个数应该为n
1.对于行来看,如果每一行都有一个筹码,那么列就可以随便填:直接全选择最小的列
2.同理对于列,直接选择最小的行
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=3e5 + 10;
#define LL long long
void solve() {
int n;
cin >> n;
vector<int> v1(n), v2(n);
for (int i = 0; i < n; i++) cin >> v1[i];
for (int i = 0; i < n; i++) cin >> v2[i];
int mn1 = *min_element(v1.begin(), v1.end());
int mn2 = *min_element(v2.begin(), v2.end());//取最小
LL sum1 = accumulate(v1.begin(), v1.end(), 0LL);
LL sum2 = accumulate(v2.begin(), v2.end(), 0LL);//累加
cout << min(1LL*mn1*n + sum2, 1LL*mn2*n + sum1) << '\n';//因为全在一列或者一行所以乘n
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}