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; }