読者です 読者をやめる 読者になる 読者になる

C++競プロ学習日記(仮)

( 学習記録であり解説Blogではないです )

Round #298 A-Exam|Codeforces

Codeforces コード 競プロ 競プロメモ

Codeforces Round #298 A-Exam を解きました。

#include <bits/stdc++.h>
#define REP2(i,x,n) for(int i=x; i<(n); i++)
using namespace std;
struct CWW{CWW(){ios::sync_with_stdio(false);cin.tie(0);}}cww;
int main()
{
	int N;
	cin >> N;

	if( N <= 2 )
	{
		cout << 1 << endl;
		cout << 1 << endl;
		return 0;
	}
	else if( N == 3 )
	{
		cout << 2 << endl;
		cout << 1 << " " << 3 << endl;
		return 0;
	}
	else
	{
		cout << N << endl;
	}
	for( int i = N; i >= 1; i-- )
	{
		if( i % 2 != 0)
		{
			cout << i <<" ";
		}
	}
	for( int i = N; i >= 1; i-- )
	{
		if( i % 2 == 0)
		{
			cout << i <<" ";
		}
	}
	cout << endl;
	return 0;
}

与えられた1-Nまでの数が隣接しない様にprintする問題ですが(他、略)
学習的と云うか、パターンの様な感じなのでメモ。

N = 6 の場合

1 2 3 4 5 6 偶奇をそれぞれ前後半に分けてprintします。

2 4 6 1 3 5 ←隣接しない!!!

この問題に関しては隣接していなければ順番は問われないので 1 3 5 2 4 6 でも可。
(尚、Nが3以下は要別処理)

別解でこう言う書き方も(メモ)↓

cout << ( i % 2 ? 0 : N / 2 ) + 1 + i / 2 << ( i + 1 == N ? '\n' : ' ' );

(こっちの方がコード量がかなり減るし良さそうではあります...)