NC223141. 反转数列
描述
给出一个长度为 的数列,你每次可以选择一段连续的区间,然后将其反转,求出在最多执行 次反转的的前提下,能够得到相邻且不同的数对数的最大值。
例如一个长度为 的数列为 ,你可以反转区间 得到 ,然后再反转区间 得到 ,得到了 对相邻且不同的数对,而且这也是经过 次操作最多可以得到的数对数。
输入描述
第一行给出两个正整数 ,含义如题
第二行给出 个正整数 ,表示数列中的 个元素
输出描述
在一行中输出在经过最多 次反转的前提下最多可以得到的相邻且不同的数对数
示例1
输入:
5 2 1 1 1 2 2
输出:
4
C++ 解法, 执行用时: 64ms, 内存消耗: 3516K, 提交时间: 2021-07-09 22:20:06
#include<bits/stdc++.h> using namespace std; int a[500005],num[500005]={0},cnt[500005]={0}; int main() { int i,n,m,t=0,s=0,mx=0,ans=0; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&a[i]); num[a[i]]++,mx=max(mx,num[a[i]]); } if(2*mx>n+1)mx=2*(n-mx); else mx=n-1; for(i=1;i<n;i++) { if(a[i]!=a[i+1])ans++; else { cnt[a[i]]++,s++; t=max(t,cnt[a[i]]); } } if(2*t>s)i=s-t; else i=s/2; while(m--) { if(i>0)i--,ans+=2; else ans++; } printf("%d\n",min(ans,mx)); return 0; }