末日的传说

mac2022-06-30  22

P1338 末日的传说

看了半天单纯的全排列和逆序对,发现……和这个题没什么关系。

实在不会做

大致思路:

一个长度为n的排列最多有(n-1)*n/2个逆序对。

把越小的元素放在越前面,肯定逆序对就少了(贪心)

若题目中给的m<=(n-2)*(n-1)/2,那就可以把最小的元素放在最前面。

若m>(n-2)*(n-1)/2,就要尽可能把最小的元素往后放。

#include<bits/stdc++.h> using namespace std; long long n,m,a[50005],t,f,p; int main() { scanf("%d%d",&n,&m); t=n,f=1; for(int i=1; i<=n; i++) { p=(n-i)*(n-1-i)/2; if(p>=m)a[f++]=i; else { a[t--]=i; m=m-(t-f+1); } } for(int i=1; i<=n; i++) printf("%d ",a[i]); return 0; }

转载于:https://www.cnblogs.com/yige2019/p/11300677.html

最新回复(0)