2020网易互娱笔试C题

题目:

巴拉巴拉,没有原题,懒得敲了

题意比较坑的地方在于,输入的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;
}

 

posted @ 2020-04-11 22:04  fjut-Hang  阅读(340)  评论(0编辑  收藏  举报