题目:
巴拉巴拉,没有原题,懒得敲了
题意比较坑的地方在于,输入的v对应的是第i个v
如果第一行的原序列是231
第二行的v序列是159
则对应上去就是591
一开始死在这个地方了
接下来讨论解法:
n分奇偶讨论
n为偶数时,显然直接交换1和2,3和4,....n-1和n(这边的数字指的是位置,不是序列对应的值)
下面的abs表示和原序列的对应距离
这样的话每个数和原本的abs距离都是1,所以就是sumv
n为奇数时,其实和n为偶数差不多,就是两两交换,但是这样必然会多出一个,所以只要选择其中三个进行错排就好了
假设一个序列为12345,那么错排的只能是123或者345,这样才能保证剩下的两两是相邻的,如果选了234,1和5交换代价太大了
那么我们考虑123如何去错排
错排结果有2种
231,312
231中,原序列的1abs为2,其他两个都为1
312中,原序列的3abs为2,其他两个都为1
所以我们必定可以构造一个错排后abs序列为只有1个2,其他都是1的情况
比如12345
可以23154,31254,21534,21453
这样的话其实就是sumv+那个abs为2的v值
我们可以发现,那个长度为3的序列,第一个和第三个都是在奇数位上,1,3,5
所以只需要暴力求出奇数位上最小的v,然后加上sumv就行了。
代码:
int index[25]; int a[25]; int main() { int _; cin>>_; while(_--) { int ans=inf; cin>>n; int x; for(int i=1; i<=n; i++) { cin>>x; index[x]=i; } int sum=0; int v; for(int i=1; i<=n; i++) { cin>>v; a[index[i]]=v; sum+=v; } if(n&1) { for(int i=1;i<=n;i+=2) ans=min(ans,sum+a[i]); cout<<ans<<endl; } else cout<<sum<<endl; } return 0; }
原文:https://www.cnblogs.com/rainH/p/12682549.html