ichirin2501's diary

いっちりーん。

SRM 459 DIV2

簡単だったのに何故かできなかったorz

250pt submit
500pt compile
1000pt opened

rate 896 -> 874 (-22)


250pt

Easy - RecursiveFigures
173.43 / 250

class RecursiveFigures
{
public:
	double getArea(int sideLength, int K)
	{
		double ret = 0.0;
		double r = (double)sideLength/2.0;
		ret = r*r*PI;
		for(int i=1;i<K;i++){
			r/=sqrt(2.0);
			ret -= (4*r*r - r*r*PI);
		}
		return ret;
	}
};

計算式をたてるのが下手というか、体調不良ということにしてくだしあ。

500pt

Medium - Inequalities
問題を理解した。と思ったら、実は微妙に理解できてなかった。
複雑に捉えてしまったようで時間内には解けず。

範囲に収まれば良いから、小数点部分も考慮したデータ構造で素直にループ回すだけ。
浮動小数点は怖いので、整数を2倍して拡張しただけのコードが下。

class Inequalities
{
public:
	int maximumSubset(vector <string> ine)
	{
		vector<string> kigo;
		int num[ine.size()];
		int X[2048];
		memset(X,0,sizeof(X));
		
		for(int i=0;i<ine.size();i++){
			stringstream ss(ine[i]);
			string str;
			int f;
			for(int j=0;ss>>str;j++){
				if(isdigit(str[0]))
					f=j,num[i] = atoi(str.c_str());
				else if(str != "X")
					kigo.push_back(str);
			}
			if(f==0){
				if(kigo[i]=="<=")kigo[i]=">=";
				else if(kigo[i]=="<")kigo[i]=">";
				else if(kigo[i]==">")kigo[i]="<";
				else if(kigo[i]=="<=")kigo[i]=">=";
			}
		}
		for(int i=-1;i<2048;i++){
			for(int j=0;j<ine.size();j++){
				if(kigo[j]=="<="){
					if(i <= 2*num[j])X[i+1]++;
				}else if(kigo[j]=="<"){
					if( i < 2*num[j])X[i+1]++;
				}else if(kigo[j]=="="){
					if( i == 2*num[j])X[i+1]++;
				}else if(kigo[j]==">"){
					if( i > 2*num[j])X[i+1]++;
				}else if(kigo[j]==">="){
					if( i >= 2*num[j])X[i+1]++;
				}
			}
		}
		int ans = 0;
		for(int i=0;i<2048;i++)ans = max(ans,X[i]);
		return ans;
	}
};