2010年10月27日水曜日

TopCoder 練習

OneRegister(SRM 486 Div1 Easy)

wataさんのコードを参考に,というかほぼ丸写ししています.

基本的には,(s,t)と(1,t)を算出して,辞書式順に早いものを返しているようです.
rec(s,t)が非常にすっきりしていて凄い.再帰で書くとTLEするかと思いましたが,余裕だったようです.

  1. import java.util.*;  
  2. import java.lang.*;  
  3. import java.math.*;  
  4.   
  5. public class OneRegister{  
  6.  public String getProgram(int s, int t){  
  7.   String res=rec(1,t);  
  8.   if(res!=null) res="/"+res;  
  9.   res=min(res,rec(s,t));  
  10.   if(res==nullreturn ":-(";  
  11.   return res;  
  12.  }  
  13.  String rec(long s,long t){  
  14.   if(s==t) return "";  
  15.   if(s>t) return null;  
  16.   String a=rec(s*2,t);  
  17.   if(a!=null) a="+"+a;  
  18.   String b=s==1?null:rec(s*s,t);  
  19.   if(b!=null) b="*"+b;  
  20.   return min(a,b);  
  21.  }  
  22.  String min(String s,String t){  
  23.   if(s==nullreturn t;  
  24.   if(t==nullreturn s;  
  25.   if(s.length()<t.length()) return="" s;<br="">  if(s.length()>t.length()) return t;  
  26.   if(s.compareTo(t)<=0return s;  
  27.   return t;  
  28.  }  
  29. }</t.length())>  

0 件のコメント: