文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

Dice Rolling [ Educational Codeforces Round 56 (Rated for Div. 2) A ]

codeforces.com


問題

2~7の数字が書かれた六面体ダイスと、n 個の数字がある。
ダイスを振って、出た目の和でそれぞれの数字を作るとき、何回振れば作ることができるか、それぞれの数字について出力せよ(最小回数ではないことに注意)。与えられる数字は、ダイスの目の和であることが保証されている。


考察

振った回数は関係ないので、ダイスの目を減らして単純化することを考えます。
ダイスは 2,3,4,5,6,7 から構成されますが、このうち、4 と 6 は 2 を複数回出すことで作れるので、消してしまいます。
また、5,7 も同様に 2 と 3 を組み合わせることで作れるので、消してしまいます。


すると、残るのは 2,3 だけです。
つまりこの問題は、2,3 を組み合わせて与えられた数字 x (2<=x<=100)を作ることができるか、という問題に単純化できます。


x が偶数のときを考えます。2以上100以下の偶数は、全て2の倍数になっているので、2を x/2 回出すことで作れます。


x が奇数のときを考えます。2 だけで奇数は作れないので、少なくとも1回以上、3 を出す必要があります。
このとき、3 を何回出せばよいかは x/3 で求まります。2 を何回出せばよいかは x%3/2 で求まります。


コード

void solve (FastScanner in, PrintWriter out) {
	
	int n = in.nextInt();
	
	for (int i=0; i<n; i++) {
		int temp = in.nextInt();
		if (temp%2 == 0) {
			out.println(temp/2);
		}
		else {
			out.println(temp/3 + temp%3/2);
		}
	}
	
}