2019 ACM-ICPC 西安邀请赛L. Swap(打表找规律)

    xiaoxiao2025-02-10  14

    目录

     

    【题目】

    【题解】

    【代码】


    【题目】

    Swap

    【题解】

    题意:给定一个长度为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; }

     

    最新回复(0)