kmjp's blog

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

AtCoder ARC #008 : A - たこ焼き買えるかな?、B - 謎のたこ焼きおじさん

久々の参加。
○○×△で250点でした。Cは後に書いた通りしょうもないミス。
Aも問題読み落としでミスってるし、問題文をちゃんと読むってのが今回の反省。

まずは1・2問目。
http://arc008.contest.atcoder.jp/tasks/arc008_1
http://arc008.contest.atcoder.jp/tasks/arc008_2

A - たこ焼き買えるかな?

たこ焼きが1個15円、10個セット100円の時、指定数を買う最安値を求める。
最初ぴったり買わないといけないと思ってミスった。
多めに買う分にはいいので、1の位が7,8,9ならセット買の方が安い。

void solve() {
	int f,r,i,j,k,l;
	int m=0,nm=0;
	
	int N=GETi();
	int PN=N/10;
	if(N%10>=7) _P("%d\n",(1+N/10)*100);
	else _P("%d\n",(N/10)*100+(N%10)*15);
}

B - 謎のたこ焼きおじさん

文字セットと、作るべき文字列が与えられるので文字セットが何セットあせば対象文字列が作れるかを求める。
0除算に注意して文字ごとに割り算すればよい。

int N,M;
char name[100];
char kit[100];
int NN[26];
int KK[26];

void solve() {
	int f,r,i,j,k,l;
	int m=0,nm=0;
	
	GET2(&N,&M);
	GETs(name);
	GETs(kit);
	ZERO(NN);
	ZERO(KK);
	
	FOR(i,N) NN[name[i]-'A']++;
	FOR(i,M) KK[kit[i]-'A']++;
	
	int min=0;
	FOR(i,26) {
		if(NN[i]==0) continue;
		if(KK[i]==0) {_P("-1\n"); return;}
		int m=(NN[i]+(KK[i]-1))/KK[i];
		if(min<m) min=m;
	}
	
	_P("%d\n",min);
}

まとめ

本当今回は問題文に悩まされてるなぁ。