Codeforces Beta Round #83 Div. 2 Only 8/24 0:00~2:00)
■A. Palindromic Times
問題
デジタル時計の時刻が与えられる(HH:MMの形式).その時刻以降で,時刻が回文になるものを求めよ.
解法
高々24x60回の計算で終わるので,逐一試す.import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class A{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; void run(){ String[] ss=sc.next().split(":"); int h=Integer.parseInt(ss[0]); int m=Integer.parseInt(ss[1]); for(;;){ if(++m==60){ m=0; if(++h==24){ h=0; } } String s=String.format("%02d:%02d", h, m); if(new StringBuffer(s).reverse().toString().equals(s)){ println(s); return; } } } void println(String s){ System.out.println(s); } void print(String s){ System.out.print(s); } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } public static void main(String[] args){ new A().run(); } }
■C. Dorm Water Supply
問題・解法
ある有向グラフが与えられる.頂点には,多くとも1つの入る/出る辺があり,辺には情報として容量が与えられる.
以下を満たす(頂点V,頂点U,容量C)を求めよ.
- Vには入る辺がない.
- Uには出る辺がない.
- Vから辺を辿ることで,Uに到着する.
- Cは,VからUに至る辺の容量で最小のもの.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class C{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int n, p; E[] es; int[] parent; LinkedList<E> answers; boolean[] visited; class E{ int from, to, cap; E(int from, int to, int cap){ this.from=from; this.to=to; this.cap=cap; } } void run(){ n=sc.nextInt(); p=sc.nextInt(); es=new E[n]; answers=new LinkedList<E>(); parent=new int[n]; fill(parent, -1); for(int i=0; i<n; i++){} for(int i=0; i<p; i++){ int a=sc.nextInt()-1; int b=sc.nextInt()-1; int d=sc.nextInt(); es[a]=new E(a, b, d); parent[b]=a; } solve(); } void solve(){ visited=new boolean[n]; for(int i=0; i<n; i++){ if(visited[i]){ continue; } int k=i; boolean loop=false; for(; parent[k]>=0;){ k=parent[k]; if(k==i){ loop=true; break; } } if(loop){ continue; } if(es[k]!=null){ visited[k]=true; dfs(es[k].to, k, es[k].cap); } } E[] anss=answers.toArray(new E[0]); sort(anss, new Comparator<E>(){ @Override public int compare(E e1, E e2){ return e1.from-e2.from; } }); println(anss.length+""); for(E e : anss){ println(e.from+" "+e.to+" "+e.cap); } } void dfs(int v, int tank, int diameter){ visited[v]=true; if(es[v]==null){ answers.add(new E(tank+1, v+1, diameter)); return; } dfs(es[v].to, tank, min(diameter, es[v].cap)); } void println(String s){ System.out.println(s); } void print(String s){ System.out.print(s); } void debug(Object... os){ // System.err.println(Arrays.deepToString(os)); } public static void main(String[] args){ new C().run(); } }
■D. Basketball Team
問題
N人からなるチームを作りたい.候補は全部でS人であり,Herr Wafaには仲間がK人いる.
S人からN人をランダムに選ぶとき,
Herr Wafaが少なくとも一人の仲間と一緒になる確率を求めよ.
N人を選べない(候補の人数が足りない)場合は-1とせよ.
解法
Herr Wafaがチームに選ばれなかった状態は省く.(N, R)を二項係数(=N個からR個を選ぶ組み合わせの総数)とする.
Herr Wafaがチームに選ばれたとして,残りのN-1人を選ぶ方法は(S-1, N-1)通り.
その内,仲間が一人も居ない場合は(S-1-K, N-1)通り.すなわち,
1-{(S-1-K, N-1)/(S-1, N-1)}
が答え.
左の項はもっと簡単に,
(S-N)(S-N-1)…(S-N-K+1)
-----------------------
(M-1)(M-2)…(M+K)
と表せるので,ループ一つで求められる.
但し,精度が落ちないように工夫して計算する必要がある(下記コード参照).
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class D{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int n, m, h; int[] s; void run(){ n=sc.nextInt(); m=sc.nextInt(); h=sc.nextInt()-1; s=new int[m]; for(int i=0; i<m; i++){ s[i]=sc.nextInt(); } solve(); } void solve(){ int sum=0; for(int i=0; i<m; i++){ sum+=s[i]; } if(sum<n){ println("-1.0"); return; } int k=s[h]-1; double ans=1; for(int i=0; i<k; i++){ ans*=(double)(sum-n-i)/(sum-1-i); } println((1-ans)+""); } void println(String s){ System.out.println(s); } void print(String s){ System.out.print(s); } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } public static void main(String[] args){ new D().run(); } }
■Result
oxoo- 2816pts. 78th1562 -> 1631
次回でDiv.1に戻れるかも知れないがしかし….
0 件のコメント:
コメントを投稿