codeforces #83 div2

A

time = hours * 60 + minutes に変換する。

int rev(int n){
  return (n/10)+10*(n%10);
}
int main(){
  int time,h,m;
  scanf("%d:%d",&h,&m);
  time = 60*h+m;
  while(true){
    time = (time+1)%(24*60);
    h = time/60;
    m = time%60;
    if(rev(h)==m){
      printf("%02d:%02d\n",h,m);
      break;
    }
  }
  return 0;
}

B

sortして、隣接する二項間の比を調べる。

int main(){
  int n;
  cin>>n;
  vector<int> a(n);
  REP(i,n)cin>>a[i];
  sort(a.begin(),a.end());
  bool ans = false;
  REP(i,n-1){
    if(a[i]!=a[i+1]&&a[i+1]<2*a[i]){
      ans = true;
    }
  }
  if(ans){
    cout<<"YES"<<endl;
  }else{
    cout<<"NO"<<endl;
  }

  return 0;
}

C

inputがないhouseからdfsする。inputもoutputもないときの処理に注意。

struct course{
  int tank,tap,amt;
  course(int tank,int tap,int amt):tank(tank),tap(tap),amt(amt){}
};
bool operator < (const course &e, const course &f){
  return e.tank < f.tank;
}
int main(void){
  int n,p;
  cin>>n>>p;
  int out[1001];
  bool in[1001]={};
  bool arv[1001]={};
  int amount[1001];
  REP(i,n){
    out[i] = -1;
  }
  REP(i,p){
    int a,b,c;
    cin>>a>>b>>c;
    a--;b--;
    out[a] = b;
    amount[a] = c;
    in[b] = true;
  }
  vector<course> ans;
  REP(i,n){
    if(in[i]) continue;
    int minamt = amount[i];
    int next = out[i];
    if(next==-1) continue;
    bool loop = false;
    while(out[next]!=-1){
      minamt = min(minamt,amount[next]);
      arv[next] = true;
      next = out[next];
      if(arv[next]){
        loop = true;
        break;
      }
    }
    if(!loop){
      ans.push_back(course(i,next,minamt));
    }
  }
  sort(ans.begin(),ans.end());
  cout<<ans.size()<<endl;
  REP(i,ans.size()){
    printf("%d %d %d\n",ans[i].tank+1,ans[i].tap+1,ans[i].amt);
  }
  return 0;
}