目录
【题目】
【题解】
题意:给定一个长度为n的各元素互不相同的序列,输出通过执行不限次数1.交换前半部分和后半部分2.交换i,i-1位置元素(i为偶数位)这两个操作可以得到的最多不同序列数目。
思路: 打表找规律。
#include <bits/stdc++.h>
using namespace std;
vector <string> vec;
bool vis(string c)
{
for(int i=0;i<vec.size();i++)
if(c==vec[i]) return true;
return false;
}
void dfs()
{
string c;
for(int i=0;i<vec.size();i++){
c=vec[i];
int l=c.size();
for(int j=0;j<l/2;j++)
swap(c[j],c[j+(l+1)/2]);
if(!vis(c)) vec.push_back(c);
c=vec[i];
for(int j=1;j<l;j+=2)
swap(c[j-1],c[j]);
if(!vis(c)) vec.push_back(c);
}
}
int main()
{
string b;
int x=0; //0,1,2,3
for(int n=1;n<=100;n++)
{
if(n%4!=x) continue;
puts("");
vec.clear();
b="";
for(int j=1;j<=n;j++)
b+='0'+j;
//cout<<b<<endl;
vec.push_back(b);
dfs();
printf("%d:%d\n",n,vec.size());
}
return 0;
}
【代码】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n; scanf("%d",&n);
int x,ans;
for(int i=0;i<n;i++) scanf("%d",&x);
if(n==1) ans=1;
else if(n==3) ans=6;
else if(n%4==0) ans=4;
else if(n%4==1) ans=2*n;
else if(n%4==2) ans=n;
else ans=12;
printf("%d\n",ans);
return 0;
}