西安邀请赛-L(打表找规律)
2024-09-05 12:55:29
题目链接:https://nanti.jisuanke.com/t/39279
题意:给定n个不同的数表示的序列,定义两种操作:1. 交换前一半和后一半(如果有奇数个,则中间的不管)。2. 交换每个偶数位和它之前的数(如果有奇数个,最后一个不管)。问通过这两种操作,可以得到多少个不同的序列。
思路:典型的打表找规律的题,下次比赛吸取教训。打表的代码如下:
#include<cstdio>
using namespace std; int a[],b[];
int n,ans; bool check(){
bool flag=;
for(int i=;i<=n;++i)
if(a[i]!=b[i]){
flag=;
break;
}
return flag;
} int main(){
for(n=;n<=;++n){
int hf=n/;
ans=;
for(int i=;i<=n;++i)
a[i]=i,b[i]=i;
while(){
for(int i=;i<=hf;++i){
int tmp=b[i];
b[i]=b[n-hf+i];
b[n-hf+i]=tmp;
}
if(check()) break;
++ans;
for(int i=;i<=n-;i+=){
int tmp=b[i];
b[i]=b[i+];
b[i+]=tmp;
}
if(check()) break;
++ans;
}
printf("%d:%d\n",n,ans+);
}
return ;
}
然后就可以找到规律了:
n%4==0: ans=4
n%4==1: if(n==1) ans=1
else ans=2*n
n%4==2: ans=n
n%4==3: if(n==3) ans=6
else ans =12
AC代码:
#include<cstdio>
using namespace std; int a[],b[];
int n,ans; bool check(){
bool flag=;
for(int i=;i<=n;++i)
if(a[i]!=b[i]){
flag=;
break;
}
return flag;
} int main(){
for(n=;n<=;++n){
int hf=n/;
ans=;
for(int i=;i<=n;++i)
a[i]=i,b[i]=i;
while(){
for(int i=;i<=hf;++i){
int tmp=b[i];
b[i]=b[n-hf+i];
b[n-hf+i]=tmp;
}
if(check()) break;
++ans;
for(int i=;i<=n-;i+=){
int tmp=b[i];
b[i]=b[i+];
b[i+]=tmp;
}
if(check()) break;
++ans;
}
printf("%d:%d\n",n,ans+);
}
return ;
}
最新文章
- VBS整人代码
- html转义字符
- JSON in JavaScript Asp.net
- [转]ORACLE 动态执行SQL语句
- Html5 Egret游戏开发 成语大挑战(一)开篇
- JavaWeb学习笔记——JavaEE基础知识
- Octave下载
- Kafka-4614问题复盘 (MappedByteBuffer未关闭导致慢磁盘访问)
- accp8.0转换教材第11章JAjax加护扩展理解与练习
- ActiveReports报表控件 V13 正式发布,提供在线报表设计和自适应报表布局
- C# 连蒙带骗不知所以然的搞定USB下位机读写
- mysql学习--1.事务
- JS获取IOS版本号
- 几种好用的经典webshell(php)
- Docker学习笔记之通过 Dockerfile 创建镜像
- angular 我看过的技术书籍
- AWS服务学习
- 地球椭球体(Ellipsoid)、大地基准面(Datum)及地图投影(Projection)三者的基本概念
- async 和 await的前世今生 (转载)
- Oracle中varchar2(XX)和varchar2(XX byte)区别