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 件のコメント:
コメントを投稿