2011年2月24日木曜日

Aizu Online Judge 0185 Goldbach's Conjecture II

■0185 Goldbach's Conjecture II

入力が最大で106なので,最初にエラトステネスの篩で素数を生成しておくのが無難.

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;
 int max=1000000;
 int[] prime;
 boolean[] isPrime;

 void run(){
  int p=0;
  prime=new int[max];
  isPrime=new boolean[max+1];
  Arrays.fill(isPrime, true);
  isPrime[0]=isPrime[1]=false;
  for(int i=2; i<=max; i++){
   if(isPrime[i]){
    prime[p++]=i;
    for(int j=2*i; j<=max; j+=i){
     isPrime[j]=false;
    }
   }
  }

  for(;;){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   int ans=0;
   for(int i=0; i<p; i++){
    if(prime[i]>n/2){
     break;
    }
    if(isPrime[n-prime[i]]){
     ans++;
    }
   }
   println(""+ans);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0184 Tsuruga Castle

■0184 Tsuruga Castle

やるだけ.出力量がかなり多いので,バッファに貯めて最後に出力した.

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;

 void run(){
  for(;;){
   int n=sc.nextInt();
   if(n==0){
    break;
   }
   int[] h=new int[7];
   for(int i=0; i<n; i++){
    int a=sc.nextInt();
    for(int k=0; k<7; k++){
     if(a<(k+1)*10||k==6){
      h[k]++;
      break;
     }
    }
   }
   for(int i=0; i<7; i++){
    println(""+h[i]);
   }
  }
  System.out.flush();
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0183 Black-and-White

■0183 Black-and-White

やるだけ.

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[][] a;
 int n;

 void run(){
  n=3;
  for(;;){
   a=new int[n][n];
   for(int j=0; j<n; j++){
    String s=sc.next();
    if(s.equals("0")){
     return;
    }
    for(int i=0; i<n; i++){
     switch(s.charAt(i)){
     case 'b':
      a[j][i]=0;
      break;
     case 'w':
      a[j][i]=1;
      break;
     case '+':
      a[j][i]=-1;
      break;
     }
    }
   }
   solve();
  }
 }

 void solve(){
  if(check(0)){
   println("b");
  }else if(check(1)){
   println("w");
  }else{
   println("NA");
  }
 }

 boolean check(int e){
  boolean f=false;
  for(int j=0; j<n; j++){
   boolean f1=true, f2=true;
   for(int i=0; i<n; i++){
    f1&=a[j][i]==e;
    f2&=a[i][j]==e;
   }
   f|=f1|f2;
  }
  boolean f1=true, f2=true;
  for(int i=0; i<n; i++){
   f1&=a[i][i]==e;
   f2&=a[i][n-1-i]==e;
  }
  return f|f1|f2;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0181 Persistence

■0181 Persistence

二分探索.

本棚の幅をbとし,幅bの本棚に全て本を収納出来ることをC(b)で表す.
この問題における答えは,C(b)となる最小のb(=bmin)であり,C(b)であるかどうかは容易に求まる,かつb<bminなるbについては,C(b)は成立しないので二分探索を適用することが出来る.
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 m, n;
 int[] a;

 void run(){
  for(;;){
   m=sc.nextInt();
   n=sc.nextInt();
   if((m|n)==0){
    break;
   }
   a=new int[n];
   for(int i=0; i<n; i++){
    a[i]=sc.nextInt();
   }
   solve();
  }
 }

 void solve(){
  int left=0, right=1500000;
  for(int i=0; i<100; i++){
   int mid=(left+right)/2;
   if(check(mid)){
    right=mid;
   }else{
    left=mid;
   }
  }
  println(""+right);
 }

 boolean check(int b){
  int d=1;
  int sum=0;
  for(int i=0; i<n; i++){
   if(a[i]>b){
    return false;
   }
   sum+=a[i];
   if(sum>b){
    sum=a[i];
    d++;
   }
  }
  return d<=m;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0180 Stellar Performance of the Debunkey Family

■0180 Stellar Performance of the Debunkey Family

最小全域木.

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, m;
 LinkedList<E> list;

 void run(){
  for(;;){
   n=sc.nextInt();
   m=sc.nextInt();
   if((n|m)==0){
    break;
   }
   list=new LinkedList<E>();
   for(int i=0; i<m; i++){
    int a=sc.nextInt();
    int b=sc.nextInt();
    int cost=sc.nextInt();
    list.add(new E(a, b, cost));
   }
   solve();
  }
 }

 void solve(){
  E[] es=list.toArray(new E[0]);
  Arrays.sort(es);
  init();
  int wt=0;
  for(E e : es){
   if(find(e.v1)!=find(e.v2)){
    union(e.v1, e.v2);
    wt+=e.w;
   }
  }
  println(""+wt);
 }

 class E implements Comparable<E>{
  int v1, v2, w;

  E(int v1, int v2, int w){
   this.v1=v1;
   this.v2=v2;
   this.w=w;
  }

  @Override
  public int compareTo(E e){
   return w-e.w;
  }
 }

 int[] p, rank;

 void init(){
  p=new int[n];
  rank=new int[n];
  for(int i=0; i<n; i++){
   p[i]=i;
   rank[i]=0;
  }
 }

 int find(int x){
  if(p[x]==x)
   return x;
  else
   return p[x]=find(p[x]);
 }

 void union(int x, int y){
  x=find(x);
  y=find(y);
  if(rank[x]>rank[y]){
   p[y]=x;
  }else{
   p[x]=y;
   if(rank[x]==rank[y])
    rank[y]++;
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0179 Mysterious Worm

■0179 Mysterious Worm

深さ優先探索.同じ状態が何度も発生しないように,既に出た状態を集合に突っ込んでおくと良い(ただし,計算量がO(logn)であるものを用いないと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;

 String worm;

 void run(){
  for(;;){
   worm=sc.next();
   if(worm.equals("0")){
    break;
   }
   solve();
  }
 }

 void solve(){
  LinkedList<String> que=new LinkedList<String>();
  TreeSet<String> set=new TreeSet<String>();
  HashMap<String, Integer> map=new HashMap<String, Integer>();
  que.add(worm);
  set.add(worm);
  map.put(worm, 0);
  for(; !que.isEmpty();){
   String s=que.poll();
   boolean f=true;
   for(int i=0; i<s.length(); i++){
    f&=s.charAt(0)==s.charAt(i);
   }
   if(f){
    println(""+map.get(s));
    return;
   }
   for(String t : next(s)){
    if(!set.contains(t)){
     que.offer(t);
     set.add(t);
     map.put(t, map.get(s)+1);
    }
   }
  }
  println("NA");
 }

 LinkedList<String> next(String s){
  LinkedList<String> list=new LinkedList<String>();
  for(int i=0; i<s.length()-1; i++){
   if(s.charAt(i)!=s.charAt(i+1)){
    char c='*';
    switch(s.charAt(i)+s.charAt(i+1)){
    case 'r'+'g':
     c='b';
     break;
    case 'g'+'b':
     c='r';
     break;
    case 'b'+'r':
     c='g';
     break;
    }
    list.add(s.substring(0, i)+c+c
      +(i<s.length()-2?s.substring(i+2, s.length()):""));
   }
  }
  return list;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

2011年2月22日火曜日

Aizu Online Judge 0176 What Color?

■0176 What Color?

やるだけ.

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;

 void run(){
  for(;;){
   String s=sc.next();
   if(s.equals("0")){
    break;
   }
   int r=Integer.parseInt(s.substring(1, 3), 16);
   int g=Integer.parseInt(s.substring(3, 5), 16);
   int b=Integer.parseInt(s.substring(5, 7), 16);
   int k=-1;
   double min=INF;
   for(int i=0; i<8; i++){
    int dr=r-(i/4)*0xff;
    int dg=g-((i/2)%2)*0xff;
    int db=b-(i%2)*0xff;
    double d=Math.sqrt(dr*dr+dg*dg+db*db);
    if(d+EPS<min){
     k=i;
     min=d;
    }
   }
   println(new String[]{"black", "blue", "lime", "aqua", "red",
     "fuchsia", "yellow", "white",}[k]);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0175 A King in Hawaii

■0175 A King in Hawaii

やるだけ.

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;

 void run(){
  for(;;){
   int n=sc.nextInt();
   if(n==-1){
    break;
   }
   println(Integer.toString(n, 4));
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0174 Badminton

■0174 Badminton

やるだけ.

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;

 String[] ss;

 void run(){
  ss=new String[3];
  for(;;){
   ss[0]=sc.next();
   if(ss[0].equals("0")){
    break;
   }
   ss[1]=sc.next();
   ss[2]=sc.next();
   solve();
  }
 }

 void solve(){
  for(int j=0; j<3; j++){
   int a=0, b=0;
   for(int i=0; i<ss[j].length()-1; i++){
    if(ss[j].charAt(i+1)=='A'){
     a++;
    }else{
     b++;
    }
   }
   if((a+1==11&&b<=9)||(a+1>=12&&a+1==b+2)){
    a++;
   }else{
    b++;
   }
   println(a+" "+b);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0173 Haunted House

■0173 Haunted House

やるだけ.

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;

 void run(){
  for(int i=0; i<9; i++){
   String s=sc.next();
   int a=sc.nextInt();
   int b=sc.nextInt();
   println(s+" "+(a+b)+" "+(a*200+b*300));
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0170 Lunch

■0170 Lunch

全探索.

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[] f;
 int[] w, s;
 int[] a, best;
 double bestG;

 void run(){
  for(;;){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   f=new String[n];
   w=new int[n];
   s=new int[n];
   for(int i=0; i<n; i++){
    f[i]=sc.next();
    w[i]=sc.nextInt();
    s[i]=sc.nextInt();
   }
   solve();
  }
 }

 void solve(){
  a=new int[n];
  best=new int[n];
  for(int i=0; i<n; i++){
   a[i]=i;
  }
  bestG=INF;
  rec(0);
  for(int e : best){
   println(f[e]);
  }
 }

 void rec(int j){
  if(j==n){
   int sumW=0;
   int nW=0;
   for(int i=n-1; i>=0; i--){
    if(s[a[i]]<sumW){
     return;
    }
    sumW+=w[a[i]];
    nW+=(i+1)*w[a[i]];
   }
   double g=(double)nW/sumW;
   if(g+EPS<bestG){
    System.arraycopy(a, 0, best, 0, n);
    bestG=g;
   }
   return;
  }

  for(int i=j; i<n; i++){
   int t=a[i];
   a[i]=a[j];
   a[j]=t;
   rec(j+1);
   t=a[i];
   a[i]=a[j];
   a[j]=t;
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0169 Blackjack

■0169 Blackjack

やるだけ.

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;

 void run(){
  for(;;){
   Scanner s=new Scanner(sc.nextLine());
   int count1=0;
   int sum=0;
   for(; s.hasNext();){
    int a=s.nextInt();
    if(a==0){
     return;
    }
    if(a>10){
     sum+=10;
    }else{
     sum+=a;
    }
    if(a==1){
     count1++;
    }
   }
   int ans=0;
   for(int i=0; i<=count1; i++){
    if(sum<=21){
     ans=sum;
    }
    sum+=10;
   }
   println(""+ans);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0168 Kannondou

■0168 Kannondou

動的計画法.

dp[段数]=組み合わせ
dp[0]=1
dp[i]=dp[i-1]+dp[i-2]+dp[i-3]
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;

 void run(){
  for(;;){
   int n=sc.nextInt();
   if(n==0){
    break;
   }
   int[] dp=new int[n+4];
   dp[0]=1;
   for(int i=0; i<=n; i++){
    dp[i+1]+=dp[i];
    dp[i+2]+=dp[i];
    dp[i+3]+=dp[i];
   }
   int ans=((dp[n]+9)/10+364)/365;
   println(ans+"");
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0167 Bubble Sort

■0167 Bubble Sort

やるだけ.

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;
 int[] a;

 void run(){
  for(;;){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   a=new int[n];
   for(int i=0; i<n; i++){
    a[i]=sc.nextInt();
   }
   solve();
  }
 }

 void solve(){
  int swap=0;
  for(int j=n-1; j>=0; j--){
   for(int i=0; i<j; i++){
    if(a[i]>a[i+1]){
     int t=a[i];
     a[i]=a[i+1];
     a[i+1]=t;
     swap++;
    }
   }
  }
  println(""+swap);
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0166 Area of Polygon

■0166 Area of Polygon

中心角θの三角形の面積は,2sin(θ/2)

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;

 void run(){
  for(;;){
   double[] area=new double[2];
   for(int j=0; j<2; j++){
    int m=sc.nextInt();
    if(m==0){
     return;
    }
    int sum=0;
    for(int i=0; i<m-1; i++){
     int deg=sc.nextInt();
     area[j]+=Math.sin(Math.toRadians(deg/2))*2;
     sum+=deg;
    }
    area[j]+=Math.sin(Math.toRadians(360-sum))/2;
   }
   if(area[0]>area[1]+EPS){
    println("1");
   }else if(area[0]+EPS<area[1]){
    println("2");
   }else{
    println("0");
   }
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0164 Ohajiki Game

■0164 Ohajiki Game

やるだけ.

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;

 void run(){
  for(;;){
   int n=sc.nextInt();
   if(n==0){
    break;
   }
   int[] a=new int[n];
   for(int i=0; i<n; i++){
    a[i]=sc.nextInt();
   }
   for(int r=31, i=0;; i=(i+1)%n){
    println(""+r);
    r-=a[i];
    if(r<=0){
     println("0");
     break;
    }
    println(""+r);
    r-=(r-1)%5;
   }
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0163 Highway Toll

■0163 Highway Toll

やるだけ.

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;

 void run(){
  int[][] d={
    //
    {0, 6, 13, 18, 23, 43, 58}, //
    {6, 0, 7, 12, 17, 37, 52}, //
    {13, 7, 0, 5, 10, 30, 45}, //
    {18, 12, 5, 0, 5, 25, 40}, //
    {23, 17, 10, 5, 0, 20, 35}, //
    {43, 37, 30, 25, 20, 0, 15}, //
    {58, 52, 45, 40, 35, 15, 0}, //
  };
  int[][] c={
    //
    {0, 300, 500, 600, 700, 1350, 1650}, //
    {300, 0, 350, 450, 600, 1150, 1500}, //
    {500, 350, 0, 250, 400, 1000, 1350}, //
    {600, 450, 250, 0, 250, 850, 1300}, //
    {700, 600, 400, 250, 0, 600, 1150}, //
    {1350, 1150, 1000, 850, 600, 0, 500}, //
    {1650, 1500, 1350, 1300, 1150, 500, 0},}; //

  for(;;){
   int ic1=sc.nextInt()-1;
   if(ic1==-1){
    break;
   }
   int h1=sc.nextInt();
   int m1=sc.nextInt()+h1*60;
   int ic2=sc.nextInt()-1;
   int h2=sc.nextInt();
   int m2=sc.nextInt()+h2*60;
   int s=17*60+30;
   int g=19*60+30;
   int ans=c[ic1][ic2];
   if((s<=m1&&m1<=g)||(s<=m2&&m2<=g)){
    if(d[ic1][ic2]<=40){
     // 半額
     ans=(int)(Math.ceil(ans/2./50.)*50+EPS);
    }
   }
   println(""+ans);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0144 Packet Transportation

■0144 Packet Transportation

BFSするだけ.

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;
 int start, goal, ttl;
 LinkedList<Integer>[] graph;

 @SuppressWarnings("unchecked")
 void run(){
  n=sc.nextInt();
  graph=new LinkedList[n];
  for(int j=0; j<n; j++){
   int u=sc.nextInt()-1;// ルータ番号
   int m=sc.nextInt();
   graph[u]=new LinkedList<Integer>();
   for(int i=0; i<m; i++){
    int v=sc.nextInt()-1;
    graph[u].add(v);
   }
  }
  int p=sc.nextInt();
  for(int i=0; i<p; i++){
   start=sc.nextInt()-1;
   goal=sc.nextInt()-1;
   ttl=sc.nextInt();
   solve();
  }
 }

 void solve(){
  LinkedList<Integer> que=new LinkedList<Integer>();
  boolean[] visited=new boolean[n];
  int[] d=new int[n];
  Arrays.fill(d, INF);
  que.offer(start);
  d[start]=1;
  visited[start]=true;
  for(; !que.isEmpty();){
   int u=que.poll();
   for(int v : graph[u]){
    if(!visited[v]){
     que.offer(v);
     d[v]=d[u]+1;
     visited[v]=true;
    }
   }
  }
  if(d[goal]<=ttl){
   println(""+d[goal]);
  }else{
   println("NA");
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0143 Altair and Vega

■0143 Altair and Vega

牽牛と織女を結ぶ線分が,三角形を構成する線分と何回交差するかで答えは決まる.

0,2回:遮断されていない
1回:遮断されている
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;
 P ps1, ps2, ps3;
 P k, s;

 void run(){
  n=sc.nextInt();
  for(int i=0; i<n; i++){
   int xp1=sc.nextInt();
   int yp1=sc.nextInt();
   int xp2=sc.nextInt();
   int yp2=sc.nextInt();
   int xp3=sc.nextInt();
   int yp3=sc.nextInt();
   int xk=sc.nextInt();
   int yk=sc.nextInt();
   int xs=sc.nextInt();
   int ys=sc.nextInt();
   ps1=new P(xp1, yp1);
   ps2=new P(xp2, yp2);
   ps3=new P(xp3, yp3);
   k=new P(xk, yk);
   s=new P(xs, ys);
   solve();
  }
 }

 void solve(){
  if(crsSS(k, s, ps1, ps2)^crsSS(k, s, ps2, ps3)^crsSS(k, s, ps3, ps1)){
   println("OK");
  }else{
   println("NG");
  }
 }

 boolean crsSS(P p1, P p2, P q1, P q2){
  if(max(p1.x, p2.x)+EPS<min(q1.x, q2.x))
   return false;
  if(max(q1.x, q2.x)+EPS<min(p1.x, p2.x))
   return false;
  if(max(p1.y, p2.y)+EPS<min(q1.y, q2.y))
   return false;
  if(max(q1.y, q2.y)+EPS<min(p1.y, p2.y))
   return false;
  return signum(p2.sub(p1).det(q1.sub(p1)))
    *signum(p2.sub(p1).det(q2.sub(p1)))<EPS
    &&signum(q2.sub(q1).det(p1.sub(q1)))
      *signum(q2.sub(q1).det(p2.sub(q1)))<EPS;
 }

 class P{
  double x, y;

  P(){
   this(0, 0);
  }

  P(double x, double y){
   this.x=x;
   this.y=y;
  }

  P add(P p){
   return new P(x+p.x, y+p.y);
  }

  P sub(P p){
   return new P(x-p.x, y-p.y);
  }

  P mul(double m){
   return new P(x*m, y*m);
  }

  P div(double d){
   return new P(x/d, y/d);
  }

  double abs(){
   return Math.sqrt(abs2());
  }

  double abs2(){
   return x*x+y*y;
  }

  double arg(){
   return Math.atan2(y, x);
  }

  // inner product
  double dot(P p){
   return x*p.x+y*p.y;
  }

  // outer product
  double det(P p){
   return x*p.y-y*p.x;
  }

  P rot90(){
   return new P(-y, x);
  }

  // conjugation
  P conj(){
   return new P(x, -y);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

2011年2月20日日曜日

Aizu Online Judge 0155 Spider Jin

■0155 Spider Jin

最初にどのビルからどのビルへ移動することが出来るかの辺を張る.あとはDijkstraをしながら,あるビルの前に訪れるビルを逐一記録しておけば良い.

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;
 int[] b, x, y;
 int m;
 int[] s, g;
 HashMap<Integer, Integer> map;

 void run(){
  for(;;){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   b=new int[n];
   x=new int[n];
   y=new int[n];
   for(int i=0; i<n; i++){
    b[i]=sc.nextInt();
    x[i]=sc.nextInt();
    y[i]=sc.nextInt();
   }
   m=sc.nextInt();
   s=new int[m];
   g=new int[m];
   for(int i=0; i<m; i++){
    s[i]=sc.nextInt();
    g[i]=sc.nextInt();
   }
   solve();
  }
 }

 void solve(){
  map=new HashMap<Integer, Integer>();
  for(int i=0; i<n; i++){
   map.put(b[i], i);
  }

  @SuppressWarnings("unchecked")
  LinkedList<E>[] es=new LinkedList[n];
  for(int j=0; j<n; j++){
   es[j]=new LinkedList<E>();
   for(int i=0; i<n; i++){
    if(i==j){
     continue;
    }
    double cost=Math.hypot(x[i]-x[j], y[i]-y[j]);
    if(cost<50+EPS){
     es[j].add(new E(i, cost));
    }
   }
  }
  for(int i=0; i<m; i++){
   LinkedList<Integer> path=dijkstra(es, map.get(s[i]), map.get(g[i]));
   if(path==null){
    println("NA");
   }else{
    for(int k=0; k<path.size(); k++){
     print(b[path.get(k)]+(k==path.size()-1?"\n":" "));
    }
   }
  }
 }

 LinkedList<Integer> dijkstra(LinkedList<E>[] es, int s, int g){
  int n=es.length;
  double[] d=new double[n];
  int[] pre=new int[n];
  PriorityQueue<P> que=new PriorityQueue<P>();

  Arrays.fill(d, INF);
  Arrays.fill(pre, -1);
  d[s]=0;
  pre[s]=s;
  que.offer(new P(s, 0));
  for(; !que.isEmpty();){
   P p=que.poll();
   if(d[p.v]<p.d)
    continue;
   for(E e : es[p.v]){
    if(d[e.to]>d[p.v]+e.cost){
     pre[e.to]=p.v;
     d[e.to]=d[p.v]+e.cost;
     que.offer(new P(e.to, d[e.to]));
    }
   }
  }
  LinkedList<Integer> path=new LinkedList<Integer>();
  for(int i=g;; i=pre[i]){
   path.addFirst(i);
   if(i==-1){
    return null;
   }
   if(i==s){
    return path;
   }
  }
 }

 class E{
  int to;
  double cost;

  E(int to, double cost){
   this.to=to;
   this.cost=cost;
  }
 }

 class P implements Comparable<P>{
  int v;
  double d;

  P(int v, double d){
   this.v=v;
   this.d=d;
  }

  @Override
  public int compareTo(P p){
   if(d+EPS<p.d){
    return -1;
   }else if(d>p.d+EPS){
    return 1;
   }else{
    return 0;
   }
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0154 Sum of Cards

■0154 Sum of Cards

動的計画法による解法.

dp[i]=総和がiとなるカードの組み合わせ
とすればよい.更新方法は↓参照.
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 m, g;
 int[] a, b, n;

 void run(){
  for(;;){
   m=sc.nextInt();
   if(m==0){
    break;
   }
   a=new int[m];
   b=new int[m];
   for(int i=0; i<m; i++){
    a[i]=sc.nextInt();
    b[i]=sc.nextInt();
   }
   g=sc.nextInt();
   n=new int[g];
   for(int i=0; i<g; i++){
    n[i]=sc.nextInt();
   }
   solve();
  }
 }

 void solve(){
  int max=1001;
  int[] dp=new int[max];
  int[] dp2=new int[max];
  dp[0]=1;
  for(int j=0; j<m; j++){
   System.arraycopy(dp, 0, dp2, 0, max);
   for(int i=0; i<b[j]; i++){
    for(int k=max-a[j]*(i+1)-1; k>=0; k--){
     dp[k+a[j]*(i+1)]+=dp2[k];
    }
   }
  }
  for(int i=0; i<g; i++){
   println(""+dp[n[i]]);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0152 Bowling

■0152 Bowling

簡単な実装ゲー.

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;
 R[] rs;

 void run(){
  for(;;){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   sc.nextLine();
   rs=new R[n];
   for(int j=0; j<n; j++){
    Scanner s=new Scanner(sc.nextLine());
    rs[j]=new R();
    rs[j].id=s.nextInt();
    for(int i=0; s.hasNext(); i++){
     rs[j].pins[i]=s.nextInt();
    }
   }
   solve();
  }
 }

 void solve(){
  for(int i=0; i<n; i++){
   rs[i].score=getScore(rs[i].pins);
  }
  Arrays.sort(rs);
  for(R r : rs){
   println(r.id+" "+r.score);
  }
 }

 int getScore(int[] pin){
  int score=0;
  for(int frame=0, i=0; frame<10; frame++){
   if(frame<9){
    if(pin[i]==10){
     score+=10+pin[i+1]+pin[i+2];
     i++;
    }else if(pin[i]+pin[i+1]==10){
     score+=10+pin[i+2];
     i+=2;
    }else{
     score+=pin[i]+pin[i+1];
     i+=2;
    }
   }else{
    score+=pin[i]+pin[i+1]+pin[i+2];
   }
  }
  return score;
 }

 class R implements Comparable<R>{
  int id, score;
  int[] pins=new int[22];

  @Override
  public int compareTo(R r){
   if(r.score!=score){
    return r.score-score;
   }else{
    return id-r.id;
   }
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0151 Grid

■0151 Grid

適当に全方向探索するだけ.

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[][] a;
 int n;

 void run(){
  for(;;){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   a=new int[n][n];
   for(int j=0; j<n; j++){
    String s=sc.next();
    for(int i=0; i<n; i++){
     a[j][i]=s.charAt(i)-'0';
    }
   }
   solve();
  }
 }

 void solve(){
  int ans=0;
  for(int j=0; j<n; j++){
   for(int i=0, k=0; i<n; i++)
    ans=Math.max(ans, k=(k+1)*a[j][i]);
   for(int i=0, k=0; i<n; i++)
    ans=Math.max(ans, k=(k+1)*a[i][j]);
   for(int i=0, k=0; j+i<n; i++)
    ans=Math.max(ans, k=(k+1)*a[j+i][i]);
   for(int i=0, k=0; j-i>=0; i++)
    ans=Math.max(ans, k=(k+1)*a[j-i][i]);
   for(int i=0, k=0; j+i<n; i++)
    ans=Math.max(ans, k=(k+1)*a[j+i][n-1-i]);
   for(int i=0, k=0; j-i>=0; i++)
    ans=Math.max(ans, k=(k+1)*a[j-i][n-1-i]);
  }
  println(""+ans);
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0150 Twin Prime

■0150 Twin Prime

やるだけ.

素数判定は簡単なものでもO(√n)で済むので,今回のケースでは予め全て求めておくことが可能.

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;

 void run(){
  boolean[] fs=new boolean[10001];
  for(int i=0; i<10001; i++){
   fs[i]=isPrime(i-2)&&isPrime(i);
  }

  for(; sc.hasNext();){
   int n=sc.nextInt();
   if(n==0){
    break;
   }
   for(; !fs[n]; n--);
   println((n-2)+" "+n);
  }
 }

 boolean isPrime(int n){
  for(int i=2; i*i<=n; i++){
   if(n%i==0){
    return false;
   }
  }
  return n>=2;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0149 Eye Test

■0149 Eye Test

やるだけ.

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;

 void run(){
  int[][] h=new int[4][2];
  double[] ts={1.1, 0.6, 0.2, 0};
  for(; sc.hasNext();){
   for(int j=0; j<2; j++){
    double s=sc.nextDouble();
    for(int i=0; i<4; i++){
     if(s+EPS>ts[i]){
      h[i][j]++;
      break;
     }
    }
   }
  }
  for(int i=0; i<4; i++){
   println(h[i][0]+" "+h[i][1]);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0148 Candy and Class Flag

■0148 Candy and Class Flag

やるだけ.

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;

 void run(){
  for(; sc.hasNext();){
   println(String.format("3C%02d", (sc.nextInt()-1)%39+1));
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0147 Fukushimaken

■0147 Fukushimaken

軽い実装ゲー.

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;

 void run(){
  LinkedList<Integer> que=new LinkedList<Integer>();
  int[] wait=new int[100]; // 待ち時間
  int[] a=new int[17]; // 座っている客
  int[] rest=new int[17]; // 客が帰るまでの時間
  int[] b=new int[17];

  for(int t=0;; t++){
   // 食事終了
   for(int i=0; i<17; i++){
    if(--rest[i]<=0){
     a[i]=-1;
    }
   }

   // 新しい客
   if(t%5==0&&t<500){
    que.addLast(t/5);
   }

   // つめられるだけつめる
   for(; !que.isEmpty();){
    int c=que.getFirst();
    int n=c%5==1?5:2;
    int j=-1;
    for(int i=16; i>=0; i--){
     b[i]=a[i]==-1?((i==16?0:b[i+1])+1):0;
     if(b[i]>=n){
      j=i;
     }
    }
    if(j==-1){
     break;
    }
    for(int i=j; i<j+n; i++){
     a[i]=c;
     rest[i]=17*(c%2)+3*(c%3)+19;
    }
    wait[c]=t-5*c;
    que.removeFirst();
   }

   if(t>500&&que.isEmpty()){
    break;
   }
  }

  for(; sc.hasNext();){
   println(""+wait[sc.nextInt()]);
  }

 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0146 Lupin The 4th

■0146 Lupin The 4th

動的計画法による解法.

dp[訪れた蔵の集合][現在訪れている蔵]=その状態までの最小時間
とすると,
dp[0][i]=0
dp[k|(1<<i)][i]=minj{dp[k][j]+|d[i]-d[j]|/(2000/(70+ws[k]))}
となる.
d[i]:城から蔵iの距離
ws[k]:kの蔵全ての千両箱の総重量
計算量O(2nn2)
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;
 int[] name, d, w;

 void run(){
  n=sc.nextInt();
  name=new int[n];
  d=new int[n];
  w=new int[n];
  for(int i=0; i<n; i++){
   name[i]=sc.nextInt();
   d[i]=sc.nextInt();
   w[i]=sc.nextInt();
  }
  solve();
 }

 void solve(){
  double[][] dp=new double[1<<n][n];
  int[][] p=new int[1<<n][n];
  int[] ws=new int[1<<n];

  for(int k=0; k<1<<n; k++){
   for(int i=0; i<n; i++){
    ws[k|(1<<i)]=ws[k]+20*w[i];
   }
  }

  for(int k=1; k<1<<n; k++){
   Arrays.fill(dp[k], INF);
  }

  for(int k=0; k<1<<n; k++){
   for(int j=0; j<n; j++){
    for(int i=0; i<n; i++){
     if((k>>i&1)==0){
      double t=dp[k][j]+Math.abs(d[i]-d[j])/2000.0*(70+ws[k]);
      if(t+EPS<dp[k|(1<<i)][i]){
       dp[k|(1<<i)][i]=t;
       p[k|(1<<i)][i]=j;
      }
     }
    }
   }
  }

  int m=0;
  for(int i=0; i<n; i++){
   if(dp[(1<<n)-1][i]+EPS<dp[(1<<n)-1][m]){
    m=i;
   }
  }

  LinkedList<Integer> path=new LinkedList<Integer>();
  for(int i=m, sup=(1<<n)-1; sup!=0;){
   path.addFirst(i);
   int j=p[sup][i];
   sup&=~(1<<i);
   i=j;
  }

  for(int i=0; i<path.size(); i++){
   print(name[path.get(i)]+(i==path.size()-1?"\n":" "));
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0145 Cards

■0145 Cards

動的計画法による解法.計算量はO(n)

dp[i][j]=i番目からj番目のカードをまとめたときの最小コスト
とすると,
dp[i][i]=0
dp[i][j]=mink{dp[i][k]+dp[k+1][j]+a[i]*b[k]*a[k+1]*b[j]}
となる.
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;
 int[] a, b;

 void run(){
  n=sc.nextInt();
  a=new int[n];
  b=new int[n];
  for(int i=0; i<n; i++){
   a[i]=sc.nextInt();
   b[i]=sc.nextInt();
  }
  solve();
 }

 void solve(){
  int[][] dp=new int[n][n];

  for(int i=0; i<n; i++){
   Arrays.fill(dp[i], INF);
   dp[i][i]=0;
  }

  for(int m=1; m<n; m++){
   for(int i=0, j=m; j<n; i++, j++){
    for(int k=i; k<j; k++){
     dp[i][j]=Math.min(dp[i][j], dp[i][k]+dp[k+1][j]+a[i]*b[k]
       *a[k+1]*b[j]);
    }
   }
  }

  println(""+dp[0][n-1]);

 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

2011年2月18日金曜日

Aizu Online Judge 0140 Bus Line

■0140 Bus Line

適当な場合分けによる冗長なコード.

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 s, g;
 int n;

 void run(){
  n=sc.nextInt();
  for(int i=0; i<n; i++){
   s=sc.nextInt();
   g=sc.nextInt();
   solve();
  }
 }

 void solve(){
  LinkedList<Integer> list=new LinkedList<Integer>();
  if(s<g){
   for(int i=s; i<=g; i++){
    list.add(i);
   }
  }else{
   if(s<=5){
    for(int i=s; i>=g; i--){
     list.add(i);
    }
   }else{
    int i=s;
    boolean f=false;
    for(; i<=9; i++){
     list.add(i);
     if(i==g){
      f=true;
      break;
     }
    }
    if(!f){
     for(i=5; i>=0; i--){
      list.add(i);
      if(i==g){
       f=true;
       break;
      }
     }
    }
    if(!f){
     for(i=1; i<=g; i++){
      list.add(i);
      if(i==g){
       f=true;
       break;
      }
     }
    }
   }
  }
  for(int i=0; i<list.size(); i++){
   print(list.get(i)+(i==list.size()-1?"\n":" "));
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0139 Snakes

■0139 Snakes

正規表現を使って判定すれば簡単.

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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;

 void run(){
  for(int n=sc.nextInt(); n>0; n--){
   String s=sc.next();
   Matcher m=Pattern.compile("^>'(=+)#(=+)~$").matcher(s);
   if(m.find()){
    if(m.group(1).length()==m.group(2).length()){
     println("A");
     continue;
    }
   }
   m=Pattern.compile("^>\\^(Q=)+~~$").matcher(s);
   if(m.find()){
    println("B");
    continue;
   }
   println("NA");
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0138 Track and Field Competition

■0138 Track and Field Competition

やるだけ.

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;

 void run(){
  R[][] rss=new R[3][8];
  for(int i=0; i<24; i++){
   R r=new R();
   r.id=sc.nextInt();
   r.time=(int)(sc.nextDouble()*100);
   rss[i/8][i%8]=r;
  }
  Arrays.sort(rss[0]);
  Arrays.sort(rss[1]);
  Arrays.sort(rss[2]);
  LinkedList<R> list=new LinkedList<R>();
  for(int i=2; i<8; i++){
   list.add(rss[0][i]);
   list.add(rss[1][i]);
   list.add(rss[2][i]);
  }
  R[] rs=list.toArray(new R[0]);
  Arrays.sort(rs);

  for(int j=0; j<3; j++){
   for(int i=0; i<2; i++){
    println(String.format("%d %.2f", rss[j][i].id,
      rss[j][i].time/100.));
   }
  }
  println(String.format("%d %.2f", rs[0].id, rs[0].time/100.));
  println(String.format("%d %.2f", rs[1].id, rs[1].time/100.));
 }

 class R implements Comparable<R>{
  int id;
  int time;

  @Override
  public int compareTo(R r){
   return time-r.time;
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0137 Middle-Square Method

■0137 Middle-Square Method

やるだけ.

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;

 void run(){
  int n=sc.nextInt();
  for(int j=1;j<=n;j++){
   int k=sc.nextInt();
   println("Case "+j+":");
   for(int i=0; i<10; i++){
    k=(k*k/100)%10000;
    println(""+k);
   }
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0136 Frequency Distribution of Height

■0136 Frequency Distribution of Height

やるだけ.

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;

 void run(){
  int n=sc.nextInt();
  int[] a=new int[6];
  for(int i=0; i<n; i++){
   double d=sc.nextDouble();
   for(int k=0; k<6; k++){
    if(d+EPS<165+k*5||k==5){
     a[k]++;
     break;
    }
   }
  }
  for(int i=0; i<6; i++){
   print((i+1)+":");
   for(int k=0; k<a[i]; k++){
    print("*");
   }
   println("");
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0135 Clock Short Hand and Long Hand

■0135 Clock Short Hand and Long Hand

時計の長針・短針の角度をそれぞれ360°に直すだけ.

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;

 void run(){
  int n=sc.nextInt();
  sc.useDelimiter("(\\s)+|[:]");
  for(int i=0; i<n; i++){
   double h=sc.nextInt()*30;
   double m=sc.nextInt()*6;
   h+=m/12;
   double d=Math.abs(h-m);
   d=Math.min(d, 360-d);
   if(d+EPS<30){
    println("alert");
   }else if(d+EPS>=90&&d<=180+EPS){
    println("safe");
   }else{
    println("warning");
   }
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0134 Exit Survey

■0134 Exit Survey

やるだけ.

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;

 void run(){
  int n=sc.nextInt();
  long sum=0;
  for(int i=0; i<n; i++){
   sum+=sc.nextInt();
  }
  println(""+(sum/n));
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0133 Rotation of a Pattern

■0133 Rotation of a Pattern

添字を弄るだけ.

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;

 void run(){
  int n=8;
  String[] ss=new String[n];
  for(int j=0; j<n; j++){
   ss[j]=sc.next();
  }
  println("90");
  for(int i=0; i<n; i++){
   for(int j=n-1; j>=0; j--){
    print(""+ss[j].charAt(i));
   }
   println("");
  }
  println("180");
  for(int j=n-1; j>=0; j--){
   for(int i=n-1; i>=0; i--){
    print(""+ss[j].charAt(i));
   }
   println("");
  }
  println("270");
  for(int i=n-1; i>=0; i--){
   for(int j=0; j<n; j++){
    print(""+ss[j].charAt(i));
   }
   println("");
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0131 Doctor's Strange Particles

■0131 Doctor's Strange Particles

いわゆるライツアウト.最上段の反転パターン方法を固定すると,あとは自動的に決定するので,最上段の反転パターンのみを全探索.

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[][] a, b;
 int[][] tmp;
 int n;

 void run(){
  n=10;
  for(int m=sc.nextInt(); m>0; m--){
   a=new int[n][n];
   for(int j=0; j<n; j++){
    for(int i=0; i<n; i++){
     a[j][i]=sc.nextInt();
    }
   }
   solve();
  }
 }

 void solve(){
  tmp=new int[n][n];
  b=new int[n][n];
  for(int sup=0; sup<1<<n; sup++){
   for(int j=0; j<n; j++){
    System.arraycopy(a[j], 0, tmp[j], 0, n);
    Arrays.fill(b[j], 0);
   }
   for(int i=0; i<n; i++){
    if(((sup>>i)&1)!=0){
     reverse(i, 0);
    }
   }
   for(int j=1; j<n; j++){
    for(int i=0; i<n; i++){
     if(tmp[j-1][i]==1){
      reverse(i, j);
     }
    }
   }
   int c=0;
   for(int i=0;i<n;i++){
    c+=tmp[n-1][i];
   }
   if(c==0){
    for(int j=0;j<n;j++){
     for(int i=0;i<n;i++){
      print(b[j][i]+(i==n-1?"\n":" "));
     }
    }
    return;
   }
  }
 }

 void reverse(int x, int y){
  int[] dx={0, 0, 0, -1, 1};
  int[] dy={0, -1, 1, 0, 0};
  for(int i=0; i<5; i++){
   int x2=x+dx[i];
   int y2=y+dy[i];
   if(x2>=0&&x2<n&&y2>=0&&y2<n){
    tmp[y2][x2]=1-tmp[y2][x2];
   }
  }
  b[y][x]=1-b[y][x];
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

2011年2月16日水曜日

Aizu Online Judge 0129 Hide-and-Seek Supporting System

■0129 Hide-and-Seek Supporting System

鬼-たろう君からなる直線と円の交点を求めて,交点が鬼-たろう君からなる線分上に存在するかを判定するだけ.

import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;

public class Main{

 Scanner sc=new Scanner(System.in);

 int INF=1<<28;
 double EPS=1e-9;

 int n, m;
 P[] cs;
 int[] rs;
 P t, s;

 void run(){
  for(;;){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   cs=new P[n];
   rs=new int[n];
   for(int i=0; i<n; i++){
    int x=sc.nextInt();
    int y=sc.nextInt();
    rs[i]=sc.nextInt();
    cs[i]=new P(x, y);
   }
   m=sc.nextInt();
   for(int i=0; i<m; i++){
    int tx=sc.nextInt();
    int ty=sc.nextInt();
    int sx=sc.nextInt();
    int sy=sc.nextInt();
    t=new P(tx, ty);
    s=new P(sx, sy);
    solve();
   }
  }
 }

 void solve(){
  boolean safe=false;
  for(int i=0; i<n; i++){
   P[] ps=isCL(cs[i], rs[i], t, s);
   for(P p : ps){
    if(between(t.x, s.x, p.x)&&between(t.y, s.y, p.y)){
     safe=true;
    }
   }
  }
  println(safe?"Safe":"Danger");
 }

 boolean between(double x1, double x2, double x){
  return (x1<x+EPS&&x<x2+EPS)||(x1+EPS>x&&x+EPS>x2);
 }

 P[] isCL(P c, double r, P p1, P p2){
  double x=p1.sub(c).dot(p2.sub(p1));
  double y=p2.sub(p1).abs2();
  double d=x*x-y*(p1.sub(c).abs2()-r*r);
  if(d<-EPS)
   return new P[0];
  if(d<0)
   d=0;
  P q1=p1.sub(p2.sub(p1).mul(x/y));
  P q2=p2.sub(p1).mul(Math.sqrt(d)/y);
  return new P[]{q1.sub(q2), q1.add(q2)};
 }

 class P{
  double x, y;

  P(){
   this(0, 0);
  }

  P(double x, double y){
   this.x=x;
   this.y=y;
  }

  P add(P p){
   return new P(x+p.x, y+p.y);
  }

  P sub(P p){
   return new P(x-p.x, y-p.y);
  }

  P mul(double m){
   return new P(x*m, y*m);
  }

  P div(double d){
   return new P(x/d, y/d);
  }

  double abs(){
   return Math.sqrt(abs2());
  }

  double abs2(){
   return x*x+y*y;
  }

  double arg(){
   return Math.atan2(y, x);
  }

  // inner product
  double dot(P p){
   return x*p.x+y*p.y;
  }

  // outer product
  double det(P p){
   return x*p.y-y*p.x;
  }

  P rot90(){
   return new P(-y, x);
  }

  // conjugation
  P conj(){
   return new P(x, -y);
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0122 Summer of Phyonkichi

■0122 Summer of Phyonkichi

適当にDFSをやって最後のスプリンクラーまでたどり着いたら"OK".

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 x, y;
 int n;
 int[] xs, ys;

 // カエルのジャンプ範囲
 int[] dx={-1, 0, 1, -1, 0, 1, -2, -2, -2, 2, 2, 2};
 int[] dy={-2, -2, -2, 2, 2, 2, -1, 0, 1, -1, 0, 1};

 void run(){
  for(;;){
   x=sc.nextInt();
   y=sc.nextInt();
   if((x|y)==0){
    break;
   }
   n=sc.nextInt();
   xs=new int[n];
   ys=new int[n];
   for(int i=0; i<n; i++){
    xs[i]=sc.nextInt();
    ys[i]=sc.nextInt();
   }
   solve();
  }
 }

 void solve(){
  for(int i=0; i<dx.length; i++){
   if(dfs(x+dx[i], y+dy[i], 0)){
    println("OK");
    return;
   }
  }
  println("NA");
 }

 // (x,y)にてk番目のスプリンクラーに突撃
 boolean dfs(int x, int y, int k){
  if(k==n){
   return true;
  }
  if(x<0||x>=10||y<0||y>=10){
   return false;
  }
  if(x<xs[k]-1||x>xs[k]+1||y<ys[k]-1||y>ys[k]+1){
   return false;
  }
  for(int i=0; i<dx.length; i++){
   if(dfs(x+dx[i], y+dy[i], k+1)){
    return true;
   }
  }
  return false;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0118 Property Distribution

■0118 Property Distribution

再帰を使うとおそらくスタックオーバーフローするので,キューを使ってBFS.

import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;

public class Main{

 Scanner sc=new Scanner(System.in);;

 int INF=1<<28;
 double EPS=1e-9;

 int[][] a;
 int w, h;
 boolean[][] visited;

 void run(){
  for(;;){
   h=sc.nextInt();
   w=sc.nextInt();
   if((h|w)==0){
    break;
   }
   a=new int[h][w];
   visited=new boolean[h][w];
   for(int j=0; j<h; j++){
    String s=sc.next();
    for(int i=0; i<w; i++){
     switch(s.charAt(i)){
     case '@':
      a[j][i]=0;
      break;
     case '#':
      a[j][i]=1;
      break;
     case '*':
      a[j][i]=2;
      break;
     }
    }
   }
   solve();
  }
 }

 void solve(){
  int ans=0;
  for(int j=0; j<h; j++){
   for(int i=0; i<w; i++){
    if(!visited[j][i]){
     ans++;
     bfs(i, j);
    }
   }
  }
  println(ans+"");
 }

 void bfs(int x, int y){
  LinkedList<P> que=new LinkedList<P>();
  que.offer(new P(x, y));
  visited[y][x]=true;
  int[] dx={0, 0, -1, 1};
  int[] dy={-1, 1, 0, 0};
  for(; !que.isEmpty();){
   P p=que.poll();
   for(int i=0; i<4; i++){
    P q=new P(p.x+dx[i], p.y+dy[i]);
    if(q.x>=0&&q.x<w&&q.y>=0&&q.y<h&&!visited[q.y][q.x]
      &&a[p.y][p.x]==a[q.y][q.x]){
     que.offer(q);
     visited[q.y][q.x]=true;
    }
   }
  }
 }

 class P{
  int x, y;

  P(int x, int y){
   this.x=x;
   this.y=y;
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  new Main().run();
 }
}

2011年2月15日火曜日

Aizu Online Judge 0117 A Reward a Carpenter

■0117 A Reward a Carpenter

(殿様から大工が受け取ったお金)-(柱の代金)-(出発町から山里までの総交通費)-(山里から出発町までの総交通費)が答え.後ろ2つは,それぞれDijkstraで求めれば良い.

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, m;

 void run(){
  sc.useDelimiter("[,]|(\\s)+");
  n=sc.nextInt();
  m=sc.nextInt();
  @SuppressWarnings("unchecked")
  LinkedList<E>[] es=new LinkedList[n];
  for(int i=0; i<n; i++){
   es[i]=new LinkedList<E>();
  }

  for(int i=0; i<m; i++){
   int u=sc.nextInt()-1;
   int v=sc.nextInt()-1;
   int cost1=sc.nextInt();
   int cost2=sc.nextInt();
   es[u].add(new E(v, cost1));
   es[v].add(new E(u, cost2));
  }

  int s=sc.nextInt()-1;
  int g=sc.nextInt()-1;
  int m1=sc.nextInt();
  int m2=sc.nextInt();

  int ans=m1-m2-(dijkstra(es, s, g)+dijkstra(es, g, s));
  println(""+ans);
 }

 int dijkstra(LinkedList<E>[] es, int s, int g){
  int n=es.length;
  int[] d=new int[n];
  PriorityQueue<P> que=new PriorityQueue<P>();

  Arrays.fill(d, INF);
  d[s]=0;
  que.offer(new P(s, 0));
  for(; !que.isEmpty();){
   P p=que.poll();
   if(d[p.v]<p.d){
    continue;
   }
   for(E e : es[p.v]){
    if(d[e.to]>d[p.v]+e.cost){
     d[e.to]=d[p.v]+e.cost;
     que.offer(new P(e.to, d[e.to]));
    }
   }
  }
  return d[g];
 }

 class E{
  int to, cost;

  E(int to, int cost){
   this.to=to;
   this.cost=cost;
  }
 }

 class P implements Comparable<P>{
  int v, d;

  P(int v, int d){
   this.v=v;
   this.d=d;
  }

  @Override
  public int compareTo(P p){
   return d-p.d;
  }

  @Override
  public String toString(){
   return v+","+d;
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0110 Alphametic

■0110 Alphametic

Xを0~9に変えて全部試すだけ.ただし,左端がXかつX=0となるようなケースに注意する必要がある.桁が大きそうなので,BigIntegerを使用した.

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;

 String e1, e2, e3;
 int x;

 void run(){
  for(; sc.hasNext();){
   String[] ss=sc.nextLine().split("[+]");
   e1=ss[0];
   ss=ss[1].split("=");
   e2=ss[0];
   e3=ss[1];
   solve();
  }
 }

 void solve(){
  for(x=0; x<10; x++){
   if(x==0){
    if(e1.length()>1&&e1.charAt(0)=='X')
     continue;
    if(e2.length()>1&&e2.charAt(0)=='X')
     continue;
    if(e3.length()>1&&e3.charAt(0)=='X')
     continue;
   }
   if(toBI(e1).add(toBI(e2)).compareTo(toBI(e3))==0){
    println(""+x);
    return;
   }
  }
  println("NA");
 }

 BigInteger toBI(String s){
  BigInteger bi=BigInteger.ZERO;
  for(char c : s.toCharArray()){
   if(c=='X'){
    bi=bi.multiply(BigInteger.TEN).add(new BigInteger(""+x));
   }else{
    bi=bi.multiply(BigInteger.TEN).add(new BigInteger(""+c));
   }
  }
  return bi;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0106 Discounts of Buckwheat

■0106 Discounts of Buckwheat

入力の範囲が狭い(46通り)ので,全入力に対する解を予め全探索で求めておく.

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;

 void run(){
  int[] a=new int[51];
  Arrays.fill(a, INF);
  for(int k=0; toGramme(0, 0, k)<=50; k++){
   for(int j=0; toGramme(0, j, k)<=50; j++){
    for(int i=0; toGramme(i, j, k)<=50; i++){
     int g=toGramme(i, j, k);
     a[g]=Math.min(a[g], toMoney(i, j, k));
    }
   }
  }
  for(;;){
   int g=sc.nextInt()/100;
   if(g==0){
    break;
   }
   println(a[g]+"");
  }
 }

 int toGramme(int i, int j, int k){
  return i*2+j*3+k*5;
 }

 int toMoney(int i, int j, int k){
  int sum=0;
  sum+=380*(i-i%5)*80/100+380*(i%5);
  sum+=550*(j-j%4)*85/100+550*(j%4);
  sum+=850*(k-k%3)*88/100+850*(k%3);
  return sum;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

2011年2月13日日曜日

Prologの技芸 12.4節の練習問題

(1)

edit :- edit(file([],[])). edit(File) :- write_prompt, read(Command), edit(File,Command). edit(File,exit) :- !. edit(File,Command) :- apply(Command,File,File1), !, edit(File1). edit(File,Command) :- writeln([Command,'is not applicable']), !, edit(File). apply(up,file([X|Xs],Ys),file(Xs,[X|Ys])). apply(up(N),file(Xs,Ys),file(Xs1,Ys1)) :- N > 0, up(N,Xs,Ys,Xs1,Ys1). apply(down,file(Xs,[Y|Ys]),file([Y|Xs],Ys)). apply(down(N),file(Xs,Ys),file(Xs1,Ys1)) :- N > 0, down(N,Xs,Ys,Xs1,Ys1). apply(insert(Line),file(Xs,Ys),file(Xs,[Line|Ys])). apply(delete,file(Xs,[Y|Ys]),file(Xs,Ys)). apply(delete(N),file(Xs,Ys),file(Xs1,Ys1)) :- N > 0, delete(N,Xs,Ys,Xs1,Ys1). apply(print,file([X|Xs],Ys),file([X|Xs],Ys)) :- writeln(X). apply(print(*),file(Xs,Ys),file(Xs,Ys)) :- reverse(Xs,Xs1), write_file(Xs1), write_file(Ys). apply(search(T), file([X|Xs],Ys), file(Xs1,Ys1)) :- search(Xs,T,N), apply(up(N),file([X|Xs],Ys),file(Xs1,Ys1)). apply(search(T), file(Xs,Ys), file(Xs1,Ys1)) :- search(Ys,T,N), apply(down(N),file(Xs,Ys),file(Xs1,Ys1)). apply(search(T), file([T|Xs],Ys), file([T|Xs],Ys)). apply(replace(S,T),file(Xs,Ys),file(Xs1,Ys1)) :- replace(Xs,Xs1,S,T), replace(Ys,Ys1,S,T). up(N,[],Ys,[],Ys). up(0,Xs,Ys,Xs,Ys). up(N,[X|Xs],Ys,Xs1,Ys1) :- N > 0, N1 is N-1, up(N1,Xs,[X|Ys],Xs1,Ys1). down(N,Xs,[],Xs,[]). down(0,Xs,Ys,Xs,Ys). down(N,Xs,[Y|Ys],Xs1,Ys1) :- N > 0, N1 is N-1, down(N1,[Y|Xs],Ys,Xs1,Ys1). delete(N,Xs,[],Xs,[]). delete(0,Xs,Ys,Xs,Ys). delete(N,Xs,[Y|Ys],Xs1,Ys1) :- N > 0, N1 is N-1, delete(N1,Xs,Ys,Xs1,Ys1). replace([],[],_,_). replace([X|Xs],[X|Ys],S,T) :- X \= S, replace(Xs,Ys,S,T). replace([S|Xs],[T|Ys],S,T) :- replace(Xs,Ys,S,T). search([X|Xs],X,1). search([X|Xs],Y,N) :- Y \= X, search(Xs,Y,M), N is M+1. write_file([X|Xs]) :- write(X), nl, write_file(Xs). write_file([]). write_prompt :- writeln('>>').

Prologの技芸 12.3節の練習問題

(1)

% nim(N,S) :- % 和がNで自分に回ってきたとき,Sと言えば勝てる. nim(N,S) :- between(1,3,S), N1 is N+S, lose(N1), !. :- dynamic win/1. :- dynamic lose/1. win(N) :- N =< 20, between(1,3,A), N1 is N+A, lemma(lose(N1)), !. lose(20). lose(N) :- N =< 20, N1 is N+1, N2 is N+2, N3 is N+3, lemma(win(N1)), lemma(win(N2)), lemma(win(N3)).

Prologの技芸 12.1節の練習問題

(1)

word_char(39). % アポストロフィ word_char(C) :- char_type(C, digit). end_of_words_char(C). :- char_code('?',C). end_of_words_char(C). :- char_code('!',C).

Prologの技芸 11.4節の練習問題

(1)

% substitute(Old,New,OldTerm,NewTerm) :- % NewTermは,OldTerm中のOldをNewに置き換えたものである. substitute(Old,New,Old,New) :- !. substitute(Old,New,Term,Term) :- atomic(Term), !. substitute(Old,New,Term,Term1) :- functor(Term,F,N), functor(Term1,F,N), substitute(N,Old,New,Term,Term1). substitute(N,Old,New,Term,Term1) :- N > 0, !, arg(N,Term,Arg), substitute(Old,New,Arg,Arg1), arg(N,Term1,Arg1), N1 is N-1, substitute(N1,Old,New,Term,Term1). substitute(0,Old,New,Term,Term1).

(2)

% select(X,Xs,Ys) :- % YsはリストXsの一番初めに出てきたXを % 削除したリストである. select(X,[X|Xs],Xs) :- !. select(X,[Y|Ys],[Y|Zs]) :- select(X,Ys,Zs).

Prologの技芸 11.3節の練習問題

(1)

X \== Y :- X == Y, !, fail. X \== Y.

(2)

nonvar(X) :- var(X), !, fail. nonvar(X).

Prologの技芸 11.1節の練習問題

(1)

% クイックソート % quicksort(Xs,Ys) :- % リストYsはリストXsの順序付けられた順列である. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X =< Y, !, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X > Y, !, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]).

(2)

% derivative(Expression,X,DifferentiatedExpression) :- % DifferentiatedExpressionは, % 式ExpressionのXに関する導関数である. constant(X) :- integer(X). constant(X) :- atom(X). derivative(X,_,0) :- constant(X), !. derivative(X,X,s(0)) :- !. derivative(X^N,X,N*X^M) :- integer(N), !, M is N-1. derivative(sin(X),X,cos(X)) :- !. derivative(cos(X),X,-sin(X)) :- !. derivative(e^X,X,e^X) :- !. derivative(log(X),X,1/X) :- !. derivative(F+G,X,DF+DG) :- !, derivative(F,X,DF), derivative(G,X,DG). derivative(F-G,X,DF-DG) :- !, derivative(F,X,DF), derivative(G,X,DG). derivative(F*G,X,F*DG+DF*G) :- !, derivative(F,X,DF), derivative(G,X,DG). derivative(1/F,X,-DF / (F*F)) :- !, derivative(F,X,DF). derivative(F/G,X,(G*DF-F*DG)/(G*G)) :- !, derivative(F,X,DF), derivative(G,X,DG).

(3)

% 挿入ソート % insertionsort(Xs,Ys) :- % リストYsはリストXsの順序付けられた順列である. insertionsort([X|Xs],Ys) :- !, insertionsort(Xs,Zs), insert(X,Zs,Ys). insertionsort([],[]). insert(X,[],[X]) :- !. insert(X,[Y|Ys],[Y|Zs]) :- X > Y, !, insert(X,Ys,Zs). insert(X,[Y|Ys],[X,Y|Ys]) :- X =< Y, !.

Prologの技芸 10.1節の練習問題

(1)

range(M,N,[M|Ns]) :- nonvar(M), nonvar(N), M < N, M1 is M+1, range(M1,N,Ns). range(M,N,[M|Ns]) :- nonvar(M), nonvar(Ns), M1 is M+1, range(M1,N,Ns). range(N,N,[N]).

(2)

plus(X,Y,Z) :- nonvar(Z), between(0,Z,X), Y is Z-X.

Prologの技芸 9.2節の練習問題

(1)

% occurrences(Sub,Term,N) :- % 項Term中の部分項Subの出現回数がNのとき真になる. occurrences(Term,Term,1) :- !. occurrences(Sub,Term,N) :- compound(Term), !, functor(Term,F,M), occurrences(M,Sub,Term,0,N). occurrences(Sub,Term,0). occurrences(M,Sub,Term,N1,N2) :- M > 0, !, arg(M,Term,Arg), occurrences(Sub,Arg,N), N3 is N+N1, M1 is M-1, occurrences(M1,Sub,Term,N3,N2). occurrences(0,Sub,Term,N,N).

(2)

% position(Subterm,Term,Position) :- % Positionは項Term中の部分項Subtermが占める % 引数位置のリストである. position(Term,Term,[]) :- !. position(Sub,Term,Path) :- compound(Term), functor(Term,F,N), position(N,Sub,Term,Path), !. position(N,Sub,Term,[N|Path]) :- arg(N,Term,Arg), position(Sub,Arg,Path). position(N,Sub,Term,Path) :- N > 1, N1 is N-1, position(N1,Sub,Term,Path).

(3)

% univ(Term,List) :- % Listは,Termの関数子と,その後ろに % Termの引数を連ねたものからなるリストである. univ(Term,[F|Args]) :- functor(Term,F,N), args(N,Term,Args,[]). args(N,Term,Xs,Ys) :- N > 0, N1 is N-1, arg(N,Term,Arg), args(N1,Term,Xs,[Arg|Ys]). args(0,Term,Xs,Xs).

(4)

% functor1(Term,F,Arity) :- % Termは,主関数子の名前がFで % 引数の数がArityであるような項である. functor1(Term,F,N) :- Term =.. [F|Args], length(Args,N). % arg1(N,Term,Arg) :- % Argは,項TermのN番目の引数である. arg1(N,Term,Arg) :- Term =.. [F|Args], retrieve(N,Args,Arg). retrieve(1,[X|Xs],X). retrieve(N,[X|Xs],Y) :- N > 1, N1 is N-1, retrieve(N1,Xs,Y).

(5)

% substitute(Old,New,OldTerm,NewTerm) :- % NewTermは,OldTerm中のOldをNewに置き換えたものである. substitute(Old,New,Old,New). substitute(Old,New,Term,Term) :- atomic(Term), Term \= Old. substitute(Old,New,Term,Term1) :- compound(Term), Term =.. [F|Args], substitute_args(Old,New,Args,Args1), Term1 =.. [F|Args1]. substitute_args(Old,New,[Arg|Args],[Arg1|Args1]) :- substitute(Old,New,Arg,Arg1), substitute_args(Old,New,Args,Args1). substitute_args(Old,New,[],[]).

Prologの技芸 9.1節の練習問題

(1)

% flatten(Xs,Ys) :- % YsはXsの要素のリストである. flatten(Xs,Ys) :- flatten(Xs,[],Ys). flatten([X|Xs],Zs,Ys) :- flatten(Xs,Zs,Ys1), flatten(X,Ys1,Ys). flatten(X,Xs,[X|Xs]) :- atomic(X), X \= []. flatten([],Xs,Xs).

Aizu Online Judge 0084 Search Engine

■0084 Search Engine

正規表現で書こうと思ったが,得意ではないので適当に自分で書いた.長いこと,単語はアルファベットのみから構成されるものと思い込んでいた….反省.

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;

 void run(){
  String line=sc.nextLine();
  String s="";
  LinkedList<String> list=new LinkedList<String>();
  for(char c : line.toCharArray()){
   if(c==' '||c=='.'||c==','){
    if(s.length()>=3&&s.length()<=6){
     list.add(s);
    }
    s="";
   }else{
    s+=c;
   }
  }
  if(s.length()>=3&&s.length()<=6){
   list.add(s);
  }
  for(int i=0; i<list.size(); i++){
   print(list.get(i)+(i==list.size()-1?"\n":" "));
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  new Main().run();
 }
}

2011年2月12日土曜日

Aizu Online Judge 0092 Square Searching

■0092 Square Searching

dp[j][i] := (i,j)が右下となる正方形の最大辺

とすると,dp[j][i]を決めるには,(i,j)の左上,左,上を見れば良い.n = min{dp[j-1][i-1], dp[j][i-1], dp[j-1][i]}とすると,(i,j)を右下とする長さn+1の正方形内は全て空白となる.即ち,

dp[j][i] = min{dp[j-1][i-1], dp[j][i-1], dp[j-1][i]} + 1

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;
 int[][] a;

 void run(){
  for(;;){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   a=new int[n][n];
   for(int j=0; j<n; j++){
    String s=sc.next();
    for(int i=0; i<n; i++){
     a[j][i]=s.charAt(i)=='.'?0:1;
    }
   }
   solve();
  }
 }

 void solve(){
  int[][] dp=new int[n][n];
  int max=0;
  for(int j=0; j<n; j++){
   for(int i=0; i<n; i++){
    if(a[j][i]==0){
     if(i>0&&j>0){
      int n=Math.min(dp[j-1][i-1],
        Math.min(dp[j][i-1], dp[j-1][i]));
      dp[j][i]=n+1;
     }else{
      dp[j][i]=1;
     }
    }else{
     dp[j][i]=0;
    }
    max=Math.max(max, dp[j][i]);
   }
  }
  println(""+max);
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0086 Patrol

■0086 Patrol

いわゆる一筆書き.ただし,この問題では,スタート地点からゴール地点へ良く必要があるので,以下のように頂点A,Bを追加する.

A----S(Graph)G---B

あとは,以下の条件(「一筆書き - Wikipedia」からの引用)の内,2つ目の条件をみたすかを調べるだけ(字数が奇数である頂点とは,ここではAとBのこと).

ある連結グラフが一筆書き可能な場合の必要十分条件は、以下の条件のいずれか一方が成り立つことである(オイラー路参照)。

  • すべての頂点の次数(頂点につながっている辺の数)が偶数 → 運筆が起点に戻る場合(閉路)
  • 次数が奇数である頂点の数が2で、残りの頂点の次数は全て偶数 → 運筆が起点に戻らない場合(閉路でない路)
import java.util.*;
import java.util.Map.Entry;
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;

 HashMap<Integer, Integer> map;

 void run(){
  map=new HashMap<Integer, Integer>();
  for(; sc.hasNext();){
   map.clear();
   for(;;){
    int v=sc.nextInt();
    int u=sc.nextInt();
    if((v|u)==0){
     break;
    }
    if(!map.containsKey(v)){
     map.put(v, 0);
    }
    if(!map.containsKey(u)){
     map.put(u, 0);
    }
    map.put(v, map.get(v)+1);
    map.put(u, map.get(u)+1);
   }
   map.put(1, map.get(1)+1);
   map.put(2, map.get(2)+1);
   boolean even=true;
   for(Entry<Integer, Integer> entry : map.entrySet()){
    even&=entry.getValue()%2==0;
   }
   println(even?"OK":"NG");
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0072 Carden Lantern

■0072 Carden Lantern

ただの最小全域木.木を構成しながら,(コスト/100-1)を灯篭の数としてカウントアップしていく.

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%lt;%lt;28;
 double EPS=1e-9;

 int n, m;
 int[][] w;

 void run(){
  sc.useDelimiter("[,]|(\\s)+");
  for(; sc.hasNext();){
   n=sc.nextInt();
   if(n==0){
    break;
   }
   m=sc.nextInt();
   w=new int[n][n];
   for(int i=0; i%lt;n; i++){
    Arrays.fill(w[i], -1);
   }
   for(int i=0; i%lt;m; i++){
    int a=sc.nextInt();
    int b=sc.nextInt();
    int c=sc.nextInt()/100;
    w[a][b]=w[b][a]=c;
   }
   solve();
  }
 }

 // w[i][j]=w[j][i]
 // w[i][j]=-1 -> E(i, j) not exist
 void solve(){
  init();
  LinkedList%lt;E> list=new LinkedList%lt;E>();

  for(int j=0; j%lt;n-1; j++)
   for(int i=j+1; i%lt;n; i++)
    if(w[j][i]!=-1)
     list.add(new E(j, i, w[j][i]));

  E[] es=list.toArray(new E[0]);
  Arrays.sort(es, new Comparator%lt;E>(){
   @Override
   public int compare(E e1, E e2){
    return e1.w-e2.w;
   }
  });

  list.clear();
  int ans=0;
  for(E e : es){
   if(find(e.v1)!=find(e.v2)){
    union(e.v1, e.v2);
    ans+=e.w-1;
    list.add(e);
   }
  }
  println(""+ans);
 }

 int[] p, rank;

 void init(){
  p=new int[n];
  rank=new int[n];
  for(int i=0; i%lt;n; i++){
   p[i]=i;
   rank[i]=0;
  }
 }

 int find(int x){
  if(p[x]==x)
   return x;
  else
   return p[x]=find(p[x]);
 }

 void union(int x, int y){
  x=find(x);
  y=find(y);
  if(rank[x]>rank[y]){
   p[y]=x;
  }else{
   p[x]=y;
   if(rank[x]==rank[y])
    rank[y]++;
  }
 }

 class E{
  int v1, v2, w;

  E(int v1, int v2, int w){
   this.v1=v1;
   this.v2=v2;
   this.w=w;
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0070 Combination of Number Sequences

■0070 Combination of Number Sequences

探索?
TLE
高速化したよー
TLE

~長い年月~

やっぱDPじゃん
テキトーに組む
TLE
ま・さ・か
実は探索?
nとsの範囲が実は狭いことに気付く(n≦10,s≦330).大きい場合は絶対に存在しない.
ばっち枝刈りしたZE
TLE
あるぇー(・3・)
nとsが小さいんだから,予めDPで生成しておけるよねー.
前に書いたDPを流用
AC
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);

 static final int INF=1<<28;
 static final double EPS=1e-9;

 int n, s;
 int[][] sum;

 void run(){
  n=10;
  s=330;
  init();
  for(; sc.hasNext();){
   n=sc.nextInt();
   s=sc.nextInt();
   if(n<=10&&s<=330){
    println(sum[n-1][s]+"");
   }else{
    println("0");
   }
  }
  sc.close();
 }

 void init(){
  int[][] dp=new int[s+1][1<<10];
  int[][] dp2=new int[s+1][1<<10];
  sum=new int[n][s+1];
  dp[0][0]=1;

  for(int j=0; j<n; j++){
   for(int i=0; i<=s; i++){
    System.arraycopy(dp[i], 0, dp2[i], 0, 1<<10);
    Arrays.fill(dp[i], 0);
   }
   for(int i=0; i<10; i++){
    int d=(j+1)*i;
    for(int b=0; b<1<<10; b++){
     if(((1<<i)&b)==0){
      for(int k=0; k+d<=s; k++){
       dp[k+d][(1<<i)|b]+=dp2[k][b];
      }
     }
    }
   }
   for(int i=0; i<=s; i++){
    for(int b=0; b<1<<10; b++){
     sum[j][i]+=dp[i][b];
    }
   }
  }
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  new Main().run();
 }
}

2011年2月11日金曜日

Aizu Online Judge 0069 Drawing Lots II

■0069 Drawing Lots II

あみだくじの実装をやるだけ.
注意点は,横棒を追加するときに,注目している場所の左右に横棒が既に置かれていないかをチェックするということ.

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 m, n;
 int start, goal;
 int[][] a;

 void run(){
  for(;;){
   m=sc.nextInt();
   if(m==0){
    break;
   }
   start=sc.nextInt()-1;
   goal=sc.nextInt()-1;
   n=sc.nextInt();
   a=new int[n][m-1];
   for(int j=0; j<n; j++){
    String s=sc.next();
    for(int i=0; i<m-1; i++){
     a[j][i]=s.charAt(i)-'0';
    }
   }
   solve();
  }
 }

 void solve(){
  if(check()){
   println("0");
   return;
  }

  for(int j=0; j<n; j++){
   for(int i=0; i<m-1; i++){
    if(a[j][i]==1){
     continue;
    }
    if(i<m-2&&a[j][i+1]==1){
     continue;
    }
    if(i>0&&a[j][i-1]==1){
     continue;
    }
    a[j][i]=1;
    if(check()){
     println((j+1)+" "+(i+1));
     return;
    }
    a[j][i]=0;
   }
  }
  println("1");
 }

 boolean check(){
  int p=start;
  for(int j=0; j<n; j++){
   if(p<m-1&&a[j][p]==1){
    p++;
   }else if(p>0&&a[j][p-1]==1){
    p--;
   }
  }
  return p==goal;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Aizu Online Judge 0043 Puzzle

■0043 Puzzle

a[k]=数字kが出てきた回数とする.
a[k]++;とすると,これはkを付け加えた場合に相当する.
あとは,aが条件をみたすかを簡単な探索で解く.

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;

 void run(){
  for(; sc.hasNext();){
   String s=sc.next();
   int[] a=new int[10];
   for(int i=0; i<s.length(); i++){
    a[s.charAt(i)-'0']++;
   }
   solve(a);
  }
 }

 void solve(int[] a){
  LinkedList<Integer> list=new LinkedList<Integer>();
  for(int i=1; i<=9; i++){
   a[i]++;
   if(satisfy(a.clone())){
    list.add(i);
   }
   a[i]--;
  }
  for(int i=0; i<list.size(); i++){
   print(list.get(i)+(i==list.size()-1?"\n":" "));
  }
  if(list.size()==0){
   println("0");
  }
 }

 boolean satisfy(int[] a){
  if(!check(a)){
   return false;
  }
  for(int i=1; i<=9; i++){
   a[i]-=2;
   if(rec(a, 0)){
    return true;
   }
   a[i]+=2;
  }
  return false;
 }

 boolean rec(int[] a, int n){
  if(!check(a)){
   return false;
  }
  if(n==4){
   return true;
  }
  for(int i=1; i<=9; i++){
   a[i]-=3;
   if(rec(a, n+1)){
    return true;
   }
   a[i]+=3;
  }
  for(int i=1; i<=7; i++){
   a[i]--;
   a[i+1]--;
   a[i+2]--;
   if(rec(a, n+1)){
    return true;
   }
   a[i]++;
   a[i+1]++;
   a[i+2]++;
  }
  return false;
 }

 boolean check(int[] a){
  for(int e : a){
   if(e<0||e>4){
    return false;
   }
  }
  return true;
 }

 void debug(Object... os){
  System.err.println(Arrays.deepToString(os));
 }

 void print(String s){
  System.out.print(s);
 }

 void println(String s){
  System.out.println(s);
 }

 public static void main(String[] args){
  // System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
  new Main().run();
 }
}

Prologでanarchy golf 001 hello world

さて,久し振りの記事は,「Prologでショートコーディング」です.

Prologを少しずつやってはいるものの,入出力関係にはどうしても疎いままなので,演習がてらにやってみよう,というわけです.

まずは,Hello, world!から

anarchy golf - hello world

m:-write('Hello, world!').

とても簡単26B.anarchy golfでは,"m"という述語から実行されます.