1510K - King‘s Task

链接:

https://codeforces.com/problemset/problem/1510/K

题意:

给一个n,给一个2*n长度的数组Q,可以做两个操作

A、交换所有Q【奇数】和Q【奇数+1】

B、交换所有Q【i】和Q【i+n】

求变成不减数列的最少操作次数

解:

1000*2的数据,冲冲冲!

同一个操作放一起做两次等于无效(因为是**!!所有!!**,第一次读题没读出来,写了一半开始重写QWQ)

所有要么ABAB…要么BABA…

可知,当n为偶数时,推导:

先A后B:1->2->n+2->n+1->1 四次还原

先B后A:1->n+1->n+2->2->1 四次还原

亦可知,当n为奇数时,推导:

先A后B:1->2->n+2->n+3->3 四次导致下标+2

先A后B:1->n+1->n+2->2->3 四次导致下标+2

所以1->n要(n-1)*2次,然后n->n+1->1,在做两次操作还原

共计2*n次

memcpy第一次用,算长度算麻了(老是copy出不正常的值)

从一开始,要sizeof(a)×(2×n+1),2*n的数据量加一然后乘int大小

实际代码:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long int ll;
const int N=2E3+5;
int a[N],b[N];
int c[N];
bool db(int n)
{
	for(int i=1;i<=2*n;i++)
	{
		if(b[i]!=c[i]) 
		{
			//cout<<b[i]<<" "<<c[i]<<" "<<i<<endl;
			return false;
		}
	}
	return true;
}
void cz1(int n)
{
	for(int i=1;i<=2*n;i+=2)
	{
		swap(c[i],c[i+1]);
	}
}
void cz2(int n)
{
	for(int i=1;i<=n;i++)
	{
		swap(c[i],c[n+i]);
	}
}
int main()
{
	int n;
	cin>>n;
	//n=999;
	for(int i=1;i<=2*n;i++)
	{
		int temp;
		cin>>temp;
		c[i]=a[i]=b[i]=temp;
	}
	sort(b+1,b+2*n+1);
	/*for(int j=1;j<=2*n;j++)
		{
			cout<<c[j]<<" ";
		}
		cout<<endl;
		cout<<"---"<<endl;*/
	int cs=0;
	if(n%2==0) cs=4;
	else cs=2*n;
	int ans1=-1,ans2=-1;
	int turn=1;
	for(int i=1;i<=cs;i++)//x1
	{
		/*for(int j=1;j<=2*n;j++)
		{
			cout<<c[j]<<" ";
		}
		cout<<endl;*/
		if(db(n))
		{
			ans1=i-1;
			break;
		}
		if(turn==1)
		{
			cz1(n);
			turn=2;
		}
		else
		{
			cz2(n);
			turn=1;
		}
	}
	//cout<<ans1<<" "<<ans2<<endl;
	memcpy(c,a,sizeof(int)*(2*n+1));
	//cout<<"copy"<<endl;
	turn=1;
	for(int i=1;i<=cs;i++)//x1
	{
		/*for(int j=1;j<=2*n;j++)
		{
			cout<<c[j]<<" ";
		}
		cout<<endl;
		cout<<"---"<<endl;*/
		if(db(n))
		{
			ans2=i-1;
			break;
		}
		if(turn==1)
		{
			cz2(n);
			turn=2;
		}
		else
		{
			cz1(n);
			turn=1;
		}
	}
	//cout<<ans1<<" "<<ans2<<endl;
	if(ans1!=-1&&ans2!=-1)
	cout<<min(ans1,ans2)<<endl;
	else cout<<max(ans1,ans2)<<endl;
}

限制:

time limit per test

3 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值