Particle

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

SRM499 Div2

久々にpracticeしました。

Easy 229.95/250
正の整数が沢山あって、X+YとX-Yが含まれている。X*Yの最大値を求めよ。

全探索で良い。AとB(A>B)の偶奇が一致するとき、整数X,Yは存在して、X=(A+B)/2,Y=(A-B)/2となる。
加法定理を逆向きに使うときにこんな感じの考え方をするので、240点代で解けなかったのは残念です。

class SimpleGuess{
public:
	int getMaximum(vector <int> s) {
		int len = s.size(),res = 0;
		for(int i = 0; i < len; i++){
			for(int j = 0; j < len; j++){
				if(i!=j && !((s[i]+s[j])%2)){
					res = max(res,abs(s[i]-s[j])*(s[i]+s[j])/4);
				}
			}
		}
		
		return res;
 	}
};


Medium 434.98/500
あるウサギXと同じ色でX以外のウサギの羽数が与えられている。ウサギは最低何羽いるか。

Yというデータが与えられていれば、ある色のウサギが(Y+1)羽存在することが分かる。(Y+1)羽以上存在する場合は、別な色になるので、色が何種類になるか考えればよい。

class ColorfulRabbits{
public:
	int getMinimum(vector <int> s) {
		sort(s.begin(),s.end());
		int len = s.size(),res = 0;
		
		for(int i = 0; i < len; i++){
			int a = s[i],b = 1,c = 0;
			while(i < len && a == s[i]){
				c++;
				if(c == s[i]+2){
					b++;
					c = 1;
				}
				i++;
			}
			i--;
			res += (a+1)*b;
		}
		
		return res;
 	}
};

Hard -/950
表に文字列、裏に数字が書いてあるカード(文字列の長さは全て等しい)を並べて、回文を作り、数字の和が最大になるようにする。

ある文字列とそれの逆になっている文字列で、数字が大きくなるようにペアを作って、回文になっている文字列の中で、一番数字が大きいものを真ん中に入れるだけ。


これは解けなきゃいけない気がするが解けてない。