2023牛客暑期多校训练营5-B Circle of Mistery
https://ac.nowcoder.com/acm/contest/57359/B
文章目录
- 2023牛客暑期多校训练营5-B Circle of Mistery
- 题意
- 解题思路
- 代码
题意
解题思路
感性地想一下,若已有一个环,则再出现其他环就显得多余,所以排列
p
p
p就是
[
i
,
i
]
[i,i]
[i,i]与一个环的结合。
对于序列
a
1
、
a
2
⋅
⋅
⋅
⋅
⋅
⋅
a
x
a_1、a_2······a_x
a1、a2⋅⋅⋅⋅⋅⋅ax,只需将它变为
a
2
、
a
3
⋅
⋅
⋅
⋅
⋅
⋅
a
x
、
a
1
a_2、a_3······a_x、a_1
a2、a3⋅⋅⋅⋅⋅⋅ax、a1就可构造一个环。考虑该变换所产生的逆序对数:
a
2
⋅
a
1
、
a
3
⋅
a
1
⋅
⋅
⋅
a
x
⋅
a
1
a_2·a_1、a_3·a_1···a_x·a_1
a2⋅a1、a3⋅a1⋅⋅⋅ax⋅a1分别一个逆序数对,对于
i
<
a
1
i<a_1
i<a1或
i
>
a
x
i>a_x
i>ax的数无影响,对于
a
1
≤
i
≤
a
x
a_1\le i\le a_x
a1≤i≤ax且
i
≠
a
j
i\ne a_j
i=aj
分别有
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,j≥k时
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(dpi−1,j−2,dpi−1,j−1+ai)
代码
#include<bits/stdc++.h>
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<i*2-1;j++)dp[i][j]=max(dp[i-1][j-2],dp[i-1][j-1]+a[j]);
for(int j=0;j<i*2-1;j++)if(dp[i][j]>=k)ans=min(ans,j);
}
if(ans!=0x3f3f3f3f)
cout<<ans;
else cout<<-1;
}