某笔试的一道简单题目

题目是从牛客网的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是不可行的
由图可知,情况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 许可协议。转载请注明出处!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值