求助(老师给我们的模拟题)
  • 板块学术版
  • 楼主czk111
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/10/4 23:21
  • 上次更新2023/10/27 08:45:55
查看原帖
求助(老师给我们的模拟题)
682044
czk111楼主2022/10/4 23:21

每个学年的开始,初一新生都要进行传统的军训。今年有一个军训教官十分奇怪,他为了测试学员们的反应能力,每次吹哨后学员们都会变换位置。每次左数第 i 位学员都会站到第 ai 个位置,经过若干次之后,队伍又会回到原来的样子。你的任务是计算 n 个人的队伍, 教官至少吹多少次哨之后,队伍能恢复到原来样子。
【输入文件】
第一行包含一个整数 N(0<N≤10,000),表示队伍的人数。
接下来的 N 行,每行一个整数 ai 表示左起第 i 个人接下来出现在左起第 ai 个位置上; 数据保证 ai 各不相同。1≤ai≤n
【输出文件】
仅包含一行,一个正整数 M,表示军官最少的吹哨次数。(答案均在 64 位整数范围之内)
【输入样例】
5
2
3
4
5
1
【输出样例】
5

这是我的代码,请问有什么问题啊?

#include <bits/stdc++.h>
using namespace std;
long long a[10010],b[10010],c[10010];
long long sum;
long long n;
bool pd(){
	for(int i=2;i<=n;i++){
		if(a[i-1]>a[i]){
			return false;
		}
	}
	return true;
}
bool zh(){
	sum++; 
	for(int i=1;i<=n;i++){
		b[c[i]]=a[i];
	}
	for(int i=1;i<=n;i++){
		a[i]=b[i];
	}
	if(pd()) return true;
	else return false;
}
int main(){
	freopen("officer.in","r",stdin);
	freopen("officer.out","w",stdout);
	cin>>n;
	for(int i=1;i<=n;i++){
		a[i]=i;
		cin>>c[i];
	}
	while(true){
		sum++;
		if(zh()){
			cout<<sum;
			exit(0);
		}
	}
	return 0;
}
2022/10/4 23:21
加载中...