CodeChef June Cook-off 2011(6/20 1:00~3:30)
■Correctness of Knight Move
やるだけ.出力をバッファリングしないとTLEします(しました).import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int n; String s; void run(){ n=sc.nextInt(); sc.nextLine(); String[] ans={"Yes", "No", "Error"}; for(int i=0; i<n; i++){ s=sc.nextLine(); println(ans[solve()]); } System.out.flush(); } int solve(){ boolean legal=true; if(s.length()!=5){ return 2; } legal&='a'<=s.charAt(0)&&s.charAt(0)<='h'; legal&='1'<=s.charAt(1)&&s.charAt(1)<='8'; legal&=s.charAt(2)=='-'; legal&='a'<=s.charAt(3)&&s.charAt(3)<='h'; legal&='1'<=s.charAt(4)&&s.charAt(4)<='8'; if(!legal){ return 2; } int x1=s.charAt(0)-'a'; int y1=s.charAt(1)-'1'; int x2=s.charAt(3)-'a'; int y2=s.charAt(4)-'1'; int dx=abs(x1-x2); int dy=abs(y1-y2); return (dx==1&&dy==2)||(dx==2&&dy==1)?0:1; } 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){ System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
■Super-plane
Dunnoの挙動は分岐無しなので,適当なループで解けます.コンテスト中は勘違いしていて,BFSをしようとしてTLE食らいまくっていました.さらに,Javaの入出力がバッファリングしてなかったため,少し調整しないと通りませんでした.import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ // Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int t, n; int cs, ts, cg, tg; E[] es; void run() throws Exception{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); t=Integer.parseInt(br.readLine()); for(; t>0; t--){ n=Integer.parseInt(br.readLine()); es=new E[n]; for(int i=0; i<n; i++){ String[] ss=br.readLine().split(" "); int c1=Integer.parseInt(ss[0])-1; int t1=Integer.parseInt(ss[1]); int c2=Integer.parseInt(ss[2])-1; int t2=Integer.parseInt(ss[3]); es[i]=new E(c1, t1, c2, t2); } sort(es); String[] ss=br.readLine().split(" "); cs=Integer.parseInt(ss[0])-1; ts=Integer.parseInt(ss[1]); cg=Integer.parseInt(ss[2])-1; tg=Integer.parseInt(ss[3]); solve(); } System.out.flush(); } void solve(){ P p=new P(cs, ts); boolean[] visited=new boolean[n]; int ans=0; boolean ok=true; E key=new E(p.c, p.t, 0, 0); for(;; ans++){ if(p.c==cg&&p.t<=tg){ break; } key.c1=p.c; key.t1=p.t; int k=binarySearch(es, key); if(k<0){ k=-1-k; } if(k==n){ ok=false; break; } if(es[k].c1!=p.c){ ok=false; break; } if(visited[k]){ ok=false; break; } visited[k]=true; p.c=es[k].c2; p.t=es[k].t2; } if(ok){ println("Yes "+ans); }else{ println("No"); } } class E implements Comparable<E>{ int c1, t1, c2, t2; E(int c1, int t1, int c2, int t2){ this.c1=c1; this.t1=t1; this.c2=c2; this.t2=t2; } @Override public int compareTo(E e){ if(c1!=e.c1){ return c1-e.c1; }else{ return t1-e.t1; } } } class P implements Comparable<P>{ int c, t; P(int c, int t){ this.c=c; this.t=t; } @Override public int compareTo(P p){ if(c!=p.c){ return c-p.c; }else{ return t-p.t; } } } 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){ System.setOut(new PrintStream(new BufferedOutputStream(System.out))); try{ new Main().run(); }catch(Exception e){ e.printStackTrace(); } } }
■Result
--o--またもやこれは酷い….CodeChefとは相性が悪いようです.C++に乗り換えるのも手だと思われます.
0 件のコメント:
コメントを投稿