Codeforces 1244 G Running in Pairs —— 贪心

This way

题意:

有两个1-n的排列,现在要让你重排这两个排列,使得
在这里插入图片描述

题解:

第一个顺序排列,第二个也先顺序排列,然后值从大到小,位置从小到大依次交换,如果超过k了就找到可以的位置,结束。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5;
ll a[N];
int main()
{
    ll n,sta,k;
    scanf("%lld%lld",&n,&sta);
    k=sta;
    ll sum=(1ll+n)*n/2;
    if(sum>k)
        return 0*printf("-1\n");
    k-=sum;
    for(int i=1;i<=n;i++)a[i]=i;
    ll now=n;
    for(ll i=1;i<=n/2;i++){
         if(now-i>k){
            swap(a[now],a[now-k]);
            k=0;
            break;
         }
         swap(a[now],a[i]);
         k-=now-i;
         now--;
    }
    printf("%lld\n",sta-k);
    for(int i=1;i<=n;i++)printf("%d%c",i," \n"[i==n]);
    for(int i=1;i<=n;i++)printf("%lld%c",a[i]," \n"[i==n]);
    return 0;
}

发布了530 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/tianyizhicheng/article/details/104143730
今日推荐