kmjp's blog

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

April Fools Contest 2018

途中で撤退してしまいました。
http://codeforces.com/contest/952


それぞれ問題は省略して解法のみ書いていきます。

A. Quirky Quantifiers

入力値の偶奇を答える。

int A;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>A;
	cout<<(A%2)<<endl;
}

B. A Map of the Cat

順に各部位の反応を見て、もう片方の猫ではありえない回答の中身とその回数が発生したら打ち切る。

map<string,int> S[2];

void solve() {
	int i,j,k,l,r,x,y; string s;
	int g=0;
	
	S[0]["no"]=5;
	S[0]["don't think so"]=1;
	S[0]["don't touch me"]=1;
	S[0]["not bad"]=1;
	S[0]["cool"]=1;
	S[0]["great"]=1;
	
	S[1]["no"]=3;
	S[1]["don't even"]=1;
	S[1]["are you serious?"]=1;
	S[1]["worse"]=1;
	S[1]["terrible"]=1;
	S[1]["no way"]=2;
	S[1]["go die in a hole"]=1;
	
	
	FOR(i,10) {
		cout<<i<<endl;
		getline(cin,s);
		
		if(S[0][s]==0) {
			cout<<"grumpy"<<endl;
			return;
		}
		if(S[1][s]==0) {
			cout<<"normal"<<endl;
			return;
		}
		S[0][s]--;
		S[1][s]--;
	}
}

C. Ravioli Sort

隣接要素が2以上差があるとラビオリが崩れるので不可。

int N;
int A[101];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	FOR(i,N) cin>>A[i];
	FOR(i,N-1) if(abs(A[i]-A[i+1])>=2) return _P("NO\n");
	_P("YES\n");
}

D. I'm Feeling Lucky!

2回ルーレットを当てる必要がある。
1/38を当てるのは現実的ではないが、"Even"等の約半分の確率で通る賭け方ができるのでそれを使う。

void solve() {
	cout<<"Even"<<endl;
}

E. Cheese Board

市松模様状の正方形グリッドに、softとhardのチーズを置ききるための最小のサイズを求める。
小さい順に1ずつインクリメントしながらチーズを置ききれるか判定すればよい。

int N;
string A[101],B[101];
int X,Y;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	FOR(i,N) {
		cin>>A[i]>>B[i];
		if(B[i]=="hard") Y++;
		else X++;
	}
	if(X>Y) swap(X,Y);
	int ret=0;
	while(1) {
		if(ret*ret/2>=X && ret*ret-ret*ret/2>=Y) break;
		ret++;
	}
	cout<<ret<<endl;
}

F. 2 + 2 != 4

普通の式の計算に対し、"+"や"-"も続く数字の最上位桁とみなし、ascii codeを元に値を計算する。

string S;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	int sign=1;
	ll ret=0,v=0;
	cin>>S;
	S+="+";
	FORR(c,S) {
		if(c=='+'||c=='-') {
			ret+=sign*v;
			sign=(c=='+')?1:-1;
			v=0;
		}
		v=v*10+c-'0';
	}
	cout<<ret<<endl;
	
}

G. Puzzling Language

引き算を行う

..
X.

を行い現在値をアスキーコードに合わせて調整後、

X.

を追加して出力する。

string S;

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	int prev=0;
	cin>>S;
	FORR(c,S) {
		int dif=(prev-c)&255;
		FOR(i,dif) cout<<".."<<endl<<"X."<<endl;
		cout<<"X."<<endl;
		
		prev=c;
	}
}

まとめ

ネタ系コンはあまり好きではないなぁ…。