Областная олимпиада по информатике 2020 год, 9-11 классы
Задача B. Перестановка
Постройте пилообразную циклическую перестановку $p$ длины $n$. Перестановка называется циклической тогда и только тогда, когда она состоит из единственного цикла.(То есть в графе с ребрами $i$ - $p_i$ ровно одна связанная компонента). Пилообразная перестановка - перестановка $p$, такая что её члены по очереди возрастают и убывают.($p_1 < p_2 > p_3 < p_4 ...$ или $p_1 > p_2 < p_3 > p_4 ...$)
- $n = 4$
- $n = 5$
- $n = 10$
- $n = 11$
- $n = 20$
- $n = 21$
- $n = 2019$
- $n = 2020$
- $n = 12345$
- $n = 123456$
4Ответ
3 1 4 2( Batyr Sardarbekov )
Комментарий/решение:
не могу понять почему неправильно, объясните если не прав
#include <iostream>
using namespace std;
int main() {
int n;
cin>>n;
int a[n+1];
a[1] = 1;
a[2] = 3;
a[3] = 2;
for(int i=4; i<=n; i++){
if(i%2==0){
a[i] = i;
}else {
a[i] = i-1;
a[i-1] = i;
}
}
cout<<a[1];
for(int i=2; i<=n; i++) cout<<" "<<a[i];
return 0;
}
Последовательность получается не циклической, потому что вершина 1 становится отдельной компонентой потому что ребро ведет само в себя
почему не проходит 3 тест
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int p = n / 2 + 1;
for (int i = 1; i <= n / 2; i++, p++)
cout << p << " " << i << " ";
if(n % 2 != 0) cout << p;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a=5,b=2;
cin>>n;
if(n==1)
{
cout<<1;
}
else if(n==2)
{
cout<<2<<" "<<1;
}
else if(n==3)
{
cout<<3<<" "<<1<<" "<<2;
}
else if(n==4)
{
cout<<3<<" "<<1<<" "<<4<<" "<<2<<" ";
}
else if(n>4)
{
cout<<3<<" "<<1<<" "<<5<<" "<<2<<" ";
}
for(int i=1;i<=n/2-2;i++)
{
if(a+2<=n)
{
a+=2;
b+=2;
cout<<a<<" "<<b<<" ";
}
else
{
a+=1;
b+=2;
cout<<a<<" "<<b<<" ";
}
}
if(n>4 && n%2==1)
{
cout<<b+2;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[123457];
int main()
{
int n;
cin>>n;
if(n%2==0)
{
for(int i=1;i<=n;i+=2)
{
if(i+2<=n)
{
a[i]=i+2;
}
else
{
a[i]=i+1;
}
}
for(int i=n;i>0;i-=2)
{
if(i-2>0)
{
a[i]=i-2;
}
else
{
a[i]=i-1;
}
}
}
else
{
for(int i=1;i<=n;i+=2)
{
if(i+2<=n)
{
a[i]=i+2;
}
else
{
a[i]=i+1;
}
}
for(int i=n-1;i>1;i-=2)
{
if(i-2>0)
{
a[i]=i-2;
}
else
{
a[i]=i-1;
}
a[n]=n-1;
a[2]=1;
}
}
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
Возможно, что при неправильном наборе формул, они будут
доредактированы модератором. При этом содержание не будет меняться.