ページ

2013/01/09

[競技プログラミング][PHP][AtCoder]名刺交換

A - 名刺交換

時間制限 : 2sec / スタック制限 : 10MB / メモリ制限 : 64MB

問題文

青木君は就職活動をおこなっている大学生で、名刺を N 枚持っています。
これから M 日間の就職活動を予定しており、 i 日目には名刺を ci 枚消費することがわかっています。
就職活動を行うにあたり、名刺が足りなくなると非常に困ります。
そこで、青木君はそれぞれの日のはじめに名刺の所持枚数を確認し、
A 枚以下ならば B 枚名刺を補充することにしました。
B 枚補充しても A 枚以下にしかならないような場合でも、それ以上の補充はできません。

最初から持っている N 枚とこのような補充で、就職活動の最後の日まで乗りきれるかどうか判定してください。
もし、足りなくなる場合は、その日付を青木君に教えてあげてください。

入力

入力は以下の形式で標準入力から与えられる。
N M A B
c1
c2
:
:
cM
1 行目に N , M , A , B が半角スペースで区切られて与えられる。
N は持っている名刺の枚数で 1≦N≦1,000 を満たす。
M は就職活動の日数で 0≦M≦100 を満たす。
A は名刺を補充するタイミングの枚数を示す数で 0≦A≦1,000 を満たす。
B は補充する名刺の枚数で 0≦B≦1,000 を満たす。
N , M , A , B は全て整数である。
2 行目から M+1 行目までの M 行間で、名刺を配る枚数がそれぞれ与えられる。
ci は i(1≦i≦M) 日目に配る名刺の枚数を表す整数で 0≦ci≦1,000 を満たす。

出力

就職活動の最後の日まで乗り切ることができればcompleteと出力すること。
もし、名刺を配りきってしまった場合は、足りなくなった日の日付を出力すること。
出力は標準出力におこない、末尾には改行をいれること。

出典

A: 名刺交換 - AtCoder Regular Contest #010 | AtCoder

回答

AtCoder/arc010_1.php at master · wada811/AtCoder · GitHub
<?php
fscanf(STDIN, "%d %d %d %d", $num, $days, $limit, $purchase);
for($i = 1; $i <= $days; $i++){
    $distribute = trim(fgets(STDIN));
    if($limit >= $num){
        $num += $purchase;
    }
    if($num >= $distribute){
        $num -= $distribute;
    }else{
        echo $i . PHP_EOL;
        exit();
    }
}
echo 'complete' . PHP_EOL;
?>
補充チェックして配布チェックして出力するだけの簡単な問題。