kmjp's blog

競技プログラミング参加記です

Codeforces #268 Div1 A. 24 Game

CF268に参加。
Bを落としたけど幸いA,Cが解けて好順位。
おかげでレートが自己ベストになった。SRMもこのぐらいならなぁ。
http://codeforces.com/contest/468/problem/A

問題

初期状態で1~Nの整数が1つずつ入った数列がある。
このうち、数列から2要素を取り除き、和か差か積のいずれかを数列に追加する、という処理を繰り返す。
最後数列が1要素になるときに24にすることができるか。

解法

色々あるが自分の解法を紹介。

  • N<=3: 最大で3*(2+1)=9までしか作れないので解なし。
  • N==4: 4*3*2*1=24
  • N==5: (5-2+3)*4*1=24
  • N>=6: 6*4*1+(5-3-2)*7*8*....=24
int N;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	if(N<=3) return _P("NO\n");
	
	_P("YES\n");
	if(N==4) {
		_P("1 * 2 = 2\n");
		_P("2 * 3 = 6\n");
		_P("6 * 4 = 24\n");
	}
	else if(N==5) {
		_P("5 - 2 = 3\n");
		_P("3 + 3 = 6\n");
		_P("4 * 6 = 24\n");
		_P("24 * 1 = 24\n");
	}
	else if(N>=6) {
		
		_P("6 * 4 = 24\n");
		_P("5 - 3 = 2\n");
		_P("2 - 2 = 0\n");
		for(i=1;i<=N;i++) if(i==1 || i>6) _P("0 * %d = 0\n",i);
		_P("24 + 0 = 24\n");
	}
}

まとめ

面白い問題だった。