首页 > 其他分享 >[Codeforces Round 876 (Div. 2)][Codeforces 1839D. Ball Sorting]

[Codeforces Round 876 (Div. 2)][Codeforces 1839D. Ball Sorting]

时间:2023-06-10 15:33:06浏览次数:52  
标签:Ball 覆盖 876 位置 Codeforces Sorting 操作

题目链接:D - Ball Sorting

题目大意:需要对一个排列按照指定操作进行排序。操作一:在数字间插入一个特殊点,可执行不超过 \(k\) 次;操作二:将在特殊点旁的数移动到任意位置。所有操作结束后特殊点会消失,要求对所有 \(k\in [1,n]\),求出操作二的最少操作次数。

分析题意可以得出,操作一放置的特殊点之作用就是将包含他在内的一个区间传送到对应的位置。那么所有的传送完成之后想要有序,就需要那些未被传送区间覆盖的位置本身构成一个上升子序列。而这些传送的代价就是被覆盖的区间长度之和。于是就可以考虑 \(\texttt{DP}\) ,设 \(f(i,j)\) 表示处理完前 \(i\) 个位置,放入了 \(j\) 个特殊点时的最小代价。

考虑如何具体设立状态,注意到如果直接贪心考虑第 \(i\) 个位置被覆盖的情况然后转移,可能就会出现不能直接贪心的情况,如 5 4 3 1 2。此时如果直接贪,到 \(3\) 这个位置时会直接选择把 \(\{4,3\}\) 覆盖掉,把 \(5\) 作为上升子序列的一部分,而最优的方案则是把 \(\{1,2\}\) 作为未被覆盖的位置,那么就需要令 \(f(3,1)=3\),这是不太好在转移过程中处理的。于是我们令 \(f(i,j)\) 表达的含义为,当 \(i\) 作为上升子序列中的一部分时,放入 \(j\) 个特殊点的最小代价。

考虑如何转移,这时我们发现实际上和最长上升子序列的转移形式差不多。直接枚举上一个未被覆盖位置 \(K\) 即可,需要保证 \(a_K<a_i\)。此时若 \(K<i-1\) 则表示中间出现了被覆盖的区间,对应代价为 \(f(K,j-1)+i-K-1\),否则代价为 \(f(i-1,j)\),表示目前仍未放置新的特殊点。

初始令 \(f(0,0)=0,a_{n+1}=n+1\),最终 \(f(n+1,k)\) 即为答案。

#include<bits/stdc++.h>
using namespace std;
#define N 550
int T,n,a[N],f[N][N];
void init()
{
	scanf("%d",&n);
	memset(f,0x3f,sizeof(f));
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	a[n+1]=n+1;
	f[0][0]=0;
	for(int i=1;i<=n+1;i++)
	for(int j=0;j<=i;j++){
		if(j)f[i][j]=min(f[i][j],f[i][j-1]);
		for(int k=i-1;k>=0;k--)if(a[k]<a[i])
			if(k==i-1)f[i][j]=min(f[i][j],f[i-1][j]);
			else if(j)f[i][j]=min(f[i][j],f[k][j-1]+i-k-1);
	}
	for(int i=1;i<=n;i++)printf("%d%c",f[n+1][i],i<n?' ':'\n');
}
int main()
{
	scanf("%d",&T);
	while(T--)init();
}

标签:Ball,覆盖,876,位置,Codeforces,Sorting,操作
From: https://www.cnblogs.com/DeaphetS/p/17471336.html

相关文章

  • Codeforces 1188D Make Equal
    设最终所有数变为的值为\(u\),\(\operatorname{bitcount}(x)\)为\(x\)二进制上为\(1\)的位数,由题可得答案即为\(\sum\limits_{i=1}^n\operatorname{bitcount}(u-a_i)\)。此时让\(a_i\)从小到大排序,答案即为\(\sum\limits_{i=1}^n\operatorname{bitcount}(u-a_......
  • Codeforces 1626 C
    1626C题意抽象出题意:给出n个区间的结尾以及它的区间长度,然后每一段连续区间的贡献为\(\sum_{i=1}^{len}i\),求总贡献。思路处理出每个区间的开头结尾,排序后处理每个连续区间就行了。代码voidsolve(){ cin>>n; for(inti=1;i<=n;i++)cin>>p[i].second; for(inti=1,......
  • Codeforces 1514 C
    1514C题意给出一个数n,求[1,2,3...n-1]的某个最长子序列,这个子序列的元素乘积模n余1。思路这是个思维题,一个数学公式\[x\equiv1(modn)\rightarrowkx\equivk(mod kn)\]所以子序列中的元素与\(n\)互质,累乘结果模\(n\)后如果不是1,那么将序列中等于结果的元素去......
  • Codeforces 1515 B
    1515B题意有n只袜子(n为偶数),但左袜子有L只,右袜子有R只,每只袜子的颜色为\(C_i\),可以进行以下操作:换袜子的方向、或者将袜子变色,问进行多少次操作后变成(n/2)对袜子思路很曲折,想了很久后终于想清楚,排除配对的袜子后,对于某类袜子\(i\),剩下\(c\geq2\)(假设剩下的是右边)只,它的配对......
  • CodeForces - 658A Bear and Reverse Radewoosh (模拟)水
    TimeLimit: 2000MS MemoryLimit: 262144KB 64bitIOFormat: %I64d&%I64uCodeForces-658ABearandReverseRadewooshSubmit StatusDescriptionLimakandRadewoosharegoingtocompeteagainsteachotherintheupcomingalgorithmiccontest.Theyareequ......
  • CodeForces - 616B Dinner with Emma (模拟)水
    TimeLimit: 1000MS MemoryLimit: 262144KB 64bitIOFormat: %I64d&%I64uCodeForces-616BDinnerwithEmmaSubmit StatusDescriptionJackdecidestoinviteEmmaoutforadinner.Jackisamodeststudent,hedoesn'twanttogotoanexpensiveres......
  • CodeForces - 659B Qualifying Contest (模拟)水
    TimeLimit: 1000MS MemoryLimit: 262144KB 64bitIOFormat: %I64d&%I64uCodeForces-659BQualifyingContestSubmit StatusDescriptionVerysoonBerlandwillholdaSchoolTeamProgrammingOlympiad.Fromeachofthe m Berlandregionsateamoftwopeo......
  • CodeForces - 670A Holidays (模拟) 水
    TimeLimit: 1000MS MemoryLimit: 262144KB 64bitIOFormat: %I64d&%I64uCodeForces-670AHolidaysSubmit StatusDescriptionOntheplanetMarsayearlastsexactly nInputThefirstlineoftheinputcontainsapositiveinteger n (1 ≤ n ≤ 1 000......
  • Codeforces Round 876 (Div. 2) 题解 A - D
    A.TheGoodArray题目大意给定两个整数\(n\)和\(k\),规定一个\(01\)数列为好的的条件是,对于\(1\simn\)中任意的\(i\),都有:\(a\)的前\(i\)个元素中至少有\(\lceil\frac{i}k\rceil\)个都是\(1\)。\(a\)的后\(i\)个元素中至少有\(\lceil\frac{i}k\rceil\)个都是......
  • codeforces.com/contest/1553/problem/B
    简单字符串哈希题意给一个字符串s和t,问从s的某个位置开始,向右到某个点后再向左,顺序遍历到的字符形成的字符串可否为t。思路数据只有500,\(O(n^3)\)可过,枚举转折点,然后枚举开头和结尾。代码intn,m,k;ullHash[1010],rHash[1010],p[1010],rp[1010],sum;voidsolve(){ ......