2023牛客暑期多校训练营5-B Circle of Mistery

2023牛客暑期多校训练营5-B Circle of Mistery

https://ac.nowcoder.com/acm/contest/57359/B

文章目录

  • 2023牛客暑期多校训练营5-B Circle of Mistery
    • 题意
    • 解题思路
    • 代码

题意

2023牛客暑期多校训练营5-B Circle of Mistery_第1张图片

解题思路

感性地想一下,若已有一个环,则再出现其他环就显得多余,所以排列 p p p就是 [ i , i ] [i,i] [i,i]与一个环的结合。
对于序列 a 1 、 a 2 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ a x a_1、a_2······a_x a1a2⋅⋅⋅⋅⋅⋅ax,只需将它变为 a 2 、 a 3 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ a x 、 a 1 a_2、a_3······a_x、a_1 a2a3⋅⋅⋅⋅⋅⋅axa1就可构造一个环。考虑该变换所产生的逆序对数:
a 2 ⋅ a 1 、 a 3 ⋅ a 1 ⋅ ⋅ ⋅ a x ⋅ a 1 a_2·a_1、a_3·a_1···a_x·a_1 a2a1a3a1⋅⋅⋅axa1分别 1 1 1对逆序数对,对于 i < a 1 ii<a1 i > a x i>a_x i>ax的数无影响,对于 a 1 ≤ i ≤ a x a_1\le i\le a_x a1iax i ≠ a j ( 1 ≤ j ≤ x ) i\ne a_j(1\le j\le x) i=aj(1jx)分别有 2 2 2对逆序数对。
d p i , j dp_{i,j} dpi,j表示前 i i i个数选取若干数,共产生 j j j对逆序数对,这些数的最大总和为 d p i , j dp_{i,j} dpi,j,答案是 d p i , j ≥ k dp_{i,j}\ge k dpi,jk j j j的最小值。得:
d p i , j = M a x ( d p i − 1 , j − 2 , d p i − 1 , j − 1 + a i ) dp_{i,j}=Max(dp_{i-1,j-2},dp_{i-1,j-1}+a_i) dpi,j=Max(dpi1,j2,dpi1,j1+ai)

代码

#include
using namespace std;
int n,a[1003],ans=0x3f3f3f3f,k,dp[1003][3003];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++)cin>>a[i];
	if(k<=0){
        for(int i=1;i<=n;i++)
		if(a[i]>=k){cout<<0;return 0;}
        cout<<-1;
        return 0;
    }
	for(int i=1;i<=n;i++){
		dp[i][0]=a[i];
		for(int j=1;j=k)ans=min(ans,j);
	}
	if(ans!=0x3f3f3f3f)
	cout<

你可能感兴趣的:(多校联赛,算法)