AtCoder Beginner Contest #017

はい。 oo-- 215位
http://abc017.contest.atcoder.jp
難易度自体が高めの回だったし、風邪が治りかけでぼーっとしてたりしてC問題以降は部分点も取りに行かずに撤退してました。

A - プロコン

ざっくりと大意

・3つの課題で合計何点取ったか??

方針のようなもの

・それぞれの課題の配点と評価で計算した得点を合計する。

ans=0
for i in xrange(3):
    s,e=map(int,raw_input().split())
    ans+=(s*e)/10
print ans
#include<iostream>
#include<cmath>
#include<string>
#include<cctype>
#include<vector>
#include<numeric>
#include<algorithm>
using namespace std;

int main(){
    double pai=3.141592653589;
    int ans=0;
    for(int i=0;i<3;i++){
        int s,e;
        scanf("%d %d",&s,&e);
        ans+=(s*e)/10;
    }
    printf("%d\n",ans);
    return 0;
}

B - choku語

ざっくりと大意

・何度読んでも問題文が何を言ってるのか解らない。
・だけど入力で与えられる文字列が 'ch', 'o', 'k', 'u' のみで構成されていればいいっぽい。

方針のようなもの

・文字を消して調べる。

l=['ch','o','k','u']
n=raw_input()
for i in range(4):
    n=n.replace(l[i],'')
print 'NO' if len(n) else 'YES'

文字列を調べるのは'ch'が初期状態で必ずくっついていることにだけ気をつければ大丈夫だと思う。'o'とかを省いた後で単独であった'c', 'h'が偶然隣り合ってもそれはchoku語ではないはずなので。

C - ハイスコア

ざっくりと大意

・ゲーム中に1からNまでの遺跡と、Mまでの宝石がある。
・それぞれの遺跡を探索するとl,rまでの宝石を手に入れてs点を獲得する。
・1からMまですべての宝石を揃えるとゲームオーバーなので、揃えずにかつ得点を最大にする。

方針のようなのもの

・解説読んで解き終わった。累積和とかいもす法を使うらしい。

n,m=map(int,raw_input().split())
ans=[0]*(m+1)
chk=k=0
while n:
    n-=1
    a,b,c=map(int,raw_input().split())
    ans[a-1]+=c
    ans[b]-=c
    chk+=c
mi=5000*100000
for i in xrange(m):
    k+=ans[i]
    mi=min(mi,k)
print chk-mi

証明ってものじゃないけど解説ではsの合計と累積和の最小の値の差が得られる得点の最大値であることが触れられてないのは自明だからかな自明だからですかね。sの合計から累積和の最小の値を省く、最小の値の部分の宝石を使わないことでゲームオーバーにならずかつ最大の得点を集められるのは自明だからですかね。一定以上の慣れがある人には自明でも言われないとって層もいると思うけど・・

D - サプリメント

ざっくりと大意

・N行で与えられるM種類のサプリメントを残がある時は最低1つ以上、沢山摂る場合は同じ種類のものはダメで必ず順番通りに摂った場合に何通りの方法があるか??

方針のようなもの

・解説読んでから後で