Particle

競技プログラミングについての雑記

SRM552 Div1

問題が面白い回でした。

Easy(Failed System Test/250)
解法自体は難しくないのですが、誤差やオーバーフローに注意しないと間違えます。

すべての色で必要な球の個数がN*(N+1)/6個(ただし、小数点以下切り捨て)であると考えて、作れるだけ作ったあと、不足している分を調整して、答えから引いていく解法で解きました。

他に二分探索で答えを求める解法もあります。

typedef long long ll;

class FoxPaintingBalls{
public:
	ll theMax(ll R, ll G, ll B, int N) {
		if(N==1)return R+G+B;
		ll a = (ll)N*(N+1)/6;
		ll ans = min(min(R,G),B)/a;
		if(N%3!=1){
			return ans;
		}
		R-=ans*a;
		G-=ans*a;
		B-=ans*a;
		ll rest=ans;
		rest-=R+G+B;
		if(rest>0){
			//ans-=ceil((double)rest/(3.0*a+1.0));にすると、doubleの精度の問題でWAする。
			ans-=rest/(a*3+1);
			if(rest%(a*3+1))ans--;
		}
		return ans;
 	}
};

Medium(-/500)
正方形を2つ作って、最大値を求める。
O(n^4)でやろうとして、解法が思いつかなくて解けませんでしたが、n<=30なので、O(n^5)やO(n^6)とかでも解けたみたいです。
(0,0)から(x,y)までの和を求めておくと、(a,b)から(c,d)までの和をO(1)で求められるようになって、そこからどうにかして解くのだと思いますが、難しかったです。

Score 50
Rating 1241 -> 1347