链接:
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