kotonoha_pcg@ぷろこんにっき

ここ(http://kotonoha-pcg.hatenablog.com/)の別館です、競プロの話が殆どです。最近mdモードに変えて一気に使い勝手が変わりました。

CF#477(Div.2) A

問題

codeforces.com

まずはソースを。

#include <bits/stdc++.h>
using namespace std;

#define sort(v) sort(v.begin(), v.end())
#define dsort(v) sort(v.begin(), v.end());
#define gsort(v) sort(v.begin(), v.end(), greater<int>())
#define pb push_back
#define wh while
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1000000007
#define PI 3.14159265

typedef long long ll;
typedef vector<int> vi;
typedef vector<string> vs;
typedef vector<ll> vll;

int main(){
    int n,s;
    int a,b;
    int ti[1000]={};
    cin>>n>>s;
    for(int i=0;i<n;i++){
        cin>>a>>b;
        ti[i]=a*60+b;
    }
    if(ti[0]>=s+1) {cout<<"0"<<" "<<"0"<<endl; return 0;}
    
    rep(i,n-1){
        if(ti[i+1]-ti[i]>=s*2+2){
            cout<<(ti[i]+s+1)/60<<" "<<(ti[i]+s+1)%60<<endl;
            return 0;
        }
    }
    cout<<(ti[n-1]+s+1)/60<<" "<<(ti[n-1]+s+1)%60<<endl;
    
    return 0;
}

概要

 飛行機の離着陸リスト(形式::h m)がn件あるんだけど、最も早い前後s時間空いてるとこに1件割り込ませたいんでそいつを求めてくれや、という話。

入力

n s
h(n) m(n)

出力

最も早く割り込める時間

h m

解法

 まずn回分の入力を分単位に変換して、配列に入れる。問題文から離着陸に1分掛かるとあるので、条件に合うのはs*2+2分空いてる要素数。これをn件分forループさせる。もしも0 0と次tの入力値(または最初の入力値)の間にs+1分間が空けば、強制的に出力は

0 0

になる。そうでなければ、条件に合う要素から

(ti[n-1]+s+1)/60(時) ti[n-1]+s+1)%60(分)

になる。

提出

 1つ目提出後にガリガリと書いたメモ。2つ目出すまでに別の要件が出来てやってたのだが、戻ってみるとあまりに字が汚すぎて読めず、時分まとめて分単位に変換するとか含めてだいぶコードを書き換えた。現状ローラーボール(Tombow ZOOM505)に筆記体走り書きと三項演算子殴り書きが安定してると思ってたけど、これは見直さないとやばそう。

 結局提出数は4。間の別件除くと40分くらい解いてたので掛かりすぎか。後随所にある誤字(sort()とdsort()とか)も直しておく。

追記

 7/May/2018 早速入力形式に脱字を発見したので修正。概要に入力h mの形式を追記。