kmjp's blog

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

東京工業大学プログラミングコンテスト2015 : A - ぼくの学生証、B - ラー油

30分ちょいしか参加できなかったので、本番中は50点問題しか解けませんでした。
http://ttpc2015.contest.atcoder.jp/tasks/ttpc2015_a
http://ttpc2015.contest.atcoder.jp/tasks/ttpc2015_b

A - ぼくの学生証


とある大学(おそらく東工大である)の学生証番号のルールは下記の通り。

  • 8文字からなる
  • 先頭2桁は入学年度を示す
  • 3文字目のB,M,Dは学部・修士・博士の課程の違いを示す。

学生証番号が与えられるとき、持ち主の所属する課程及び入学年度を求めよ。

3文字目を見て課程を判定する。入学年度は先頭2文字を返すだけ。

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>s;
	if(s[2]=='B') cout<<"Bachelor ";
	if(s[2]=='M') cout<<"Master ";
	if(s[2]=='D') cout<<"Doctor ";
	cout<<s[0]<<s[1]<<endl;
}

B - ラー油

i日目にラー油をxかけた担担麺を食べると、幸福度A[i]*xを得る。
1日にかけてよいラー油の上限はB、N日合計の上限はCである。
Aが昇順の時、N日で得られる幸福度の総和の最大値を求めよ。

後の日ほど高い満足度が得られるので、後ろからBずつかけていけばよい。

int N,B,C;
int A[101010];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N>>B>>C;
	FOR(i,N) cin>>A[i];
	reverse(A,A+N);
	
	int ret=0;
	FOR(i,N) {
		x=min(C,B);
		ret +=x*A[i];
		C-=x;
	}
	cout<<ret<<endl;
	
}

まとめ

ちょうど(競プロとは関係ない文脈で)東工大の学生証は課程を示すアルファベットが入っているという話をしたところでした。