题解 P6892 [ICPC2014 WF]Baggage

时间:2021-08-02
本文章向大家介绍题解 P6892 [ICPC2014 WF]Baggage,主要包括题解 P6892 [ICPC2014 WF]Baggage使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

解题思路

非常好的一道构造题。

在手动模拟几个样例(也许不止几个)之后呢。

就可以发现其实这些操作的开始以及最后几步是有相通之处的。

关于手动模拟的样例放在了文章末尾,需要的自取。

先考虑操作次数。

尝试探索答案的下界,设 x 为序列中相邻的相同元素对数。

那么初始为 \(x=0\),而最终 \(x=2(n-1)\).

且除了第一次操作每次操作最多可以使 x 加 2。

那么答案下界就是 n。

然后,通过手动模拟的样例可以发现:

除了三操作之外的所有操作,其实都可以通过递归从以前的状态转移过来。

接下来就是边界,我们发现其实每一次的递归都会把序列的长度缩小 8 。

因此,边界就是 \(\bmod\;8\) 之后的 4 种余数。

由于 3 的转移是不规则的,因此我们要将此种边界调整到 7。

其它

洛谷的评测机好像并不会告诉你这道题出错的地方。

我们可以自己写一个 Special_Judge 。

将 n 的大小以及自己的程序输出,放进去,看看最后的序列是否符合要求。

当然我也写了一份,放在后面

code

AC 代码

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
const int N=110;
int n;
void print(int x,int y)	{printf("%lld to %lld\n",x,y);}
void Judge(int l)
{
	print(l+1,l-2);
	print(l+4,l+1);
	print(l+2,l-4);
}
void solve(int l,int r)
{
	if(r-l+1<=2)	return ;
	if(r-l+1==10)
	{
		print(r-2,l-2);
		print(l+2,r-2);
		print(r-4,l+2);
		print(l-1,r-4);
		print(r-1,l-1);
		return ;
	}
	if(r-l+1==12)
	{
		print(r-2,l-2);
		print(r-5,r-2);
		print(l+1,r-5);
		print(r-6,l+1);
		print(l-1,r-6);
		print(r-1,l-1);
		return ;
	}
	if(r-l+1==14)
	{
		print(l+7,l-2);
		print(l+4,l+7);
		print(l+11,l+4);
		print(l+2,l+11);
		print(l+8,l+2);
		print(l-1,l+8);
		print(l+12,l-1);
		return ;
	}
	print(r-2,l-2);
	print(l+2,r-2);
	solve(l+4,r-4);
	print(l-1,r-5);
	print(r-1,l-1);
}
signed main()
{
	n=read();
	if(n==3)	Judge(1);
	else	solve(1,2*n);
	return 0;
}

Special_Judge

#include<bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define f() cout<<"Pass"<<endl
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0')
	{
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
int n;
char ch[500];
void move(int y,int x)
{
	ch[x]=ch[y];
	ch[x+1]=ch[y+1];
	ch[y+1]=ch[y]='_';
}
void print()
{
	for(int j=2*n-1;j<=4*n;j++)
		cout<<ch[j];
	cout<<'\n';
}
signed main()
{
	n=read();
	fill(ch+1,ch+4*n+1,'_');
	for(int i=2*n+1;i<=4*n;i++)
		if(i&1)	ch[i]='B';
		else	ch[i]='A';
	for(int i=1,l,r;i<=n;i++)
	{
		l=read();
		r=read();
		print();
		move(l+2*n,r+2*n);
	}
	print();
	return 0;
}

样例

  • n=3
__BABABA
ABB__ABA
ABBBAA__
ABBB____
  • n=4
__BABABABA
ABBABAB__A
ABBA__BBAA
A__ABBBBAA
AAAABBBB__
  • n=5
__BABABABABA
ABBABABAB__A
ABBA__BABBAA
ABBAABB__BAA
A__AABBBBBAA
AAAAABBBBB__
  • n=6
__BABABABABABA
ABBABABABAB__A
ABBABABA__BBAA
ABB__ABAABBBAA
ABBAAAB__BBBAA
A__AAABBBBBBAA
AAAAAABBBBBB__
  • n=7
__BABABABABABABA
ABBABABAB__ABABA
ABBABA__BBAABABA
ABBABAABBBAAB__A
ABBA__ABBBAABBAA
ABBAAAABBB__BBAA
A__AAAABBBBBBBAA
AAAAAAABBBBBBB__

原文地址:https://www.cnblogs.com/Varuxn/p/15089787.html