题目是从牛客网的Harmon转载过来的,本人仅提供解法,如有侵权,请私信。
题目链接:https://www.nowcoder.com/discuss/405887?type=1
最小错排
//样例
//输入
3
3
1 2 3
1 2 3
4
4 3 2 1
1 1 1 1
2
1 2
10 20
//输出
7
4
30
由样例可知,这是一道规律题。
当n为偶数的时候,数列两两位置互换即可达到距离最小条件,即最小距离为权值总和。
当n为奇数时,由于要形成错排,所以多出来的元素必须要和一组有两个数组合才能形成错排,所以要将最小权*2再加上权值的总和就可以算出最小距离。
(我怕说得太绕,放一张图帮助理解)
由图可知,情况2是达不到错排效果的。
知道该规律后可以直接写代码:
#include <bits/stdc++.h>
using namespace std;
int maxDataSize = 20;
int maxTimes = 10;
int main() {
int times = 0;
cin >> times;
if(times<=0 || times>maxTimes)return -1;
while (times--) {
float res = 0, min = 201;
int dSize = 0;
cin >> dSize;
if (dSize <= 0 || dSize>20)return -1;
vector<int> v(dSize,0);
vector<int> data(dSize,0);
for (int i = 0; i < dSize; ++i) {
cin>>data[i];
}
for (int i = 0; i < dSize; ++i) {
cin >> v[i];
res += v[i];
min = (min < v[i] * data[i] ? min : v[i] * data[i]);
}
if (dSize % 2) {
res += min;
}
cout<<res<<endl;
}
return 0;
}
本文作者:"( ̄y▽, ̄)╭ "
本文链接:https://blog.csdn.net/weixin_42703404/article/details/105465902
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!