SlideShare a Scribd company logo
1 of 19
+ 
AtCoderRegular14C 
ICPC AOJ Meeting 2014/11/24
+ 
Problem 
 高橋君が大好きなプラスチック製の円筒と不思議な赤青緑3色の 
ボールがある。 
このボールはぎりぎり円筒に入れることができる大きさである。 
円筒の両端を便宜上、右と左と呼ぶことにすると、左右好きな方 
からボールを入れることができる。 
このボールは同じ色のボールと接触すると消える性質を持ってい 
る。 
さらに、これら3 色の複数個のボールを入れる順番のみが決まっ 
ている時、それぞれのボールを左右のどちらから入れるかによっ 
て全てのボールを入れ終わった後に残るボールの数が変化する。 
3 色の複数個のボールを入れる順番のみが与えられ、最後に円筒 
に残るボールの数が最小になるよう計画したとき、円筒に残る 
ボール数の最小値を答えよ。
+ 
Example 
 まずR を入れる。R 
 次にG を左から入れる。GR 
 B を右から入れる。GRB 
 G を右から入れる。GRBG 
 G を右から入れる。GRBGG 
 この時G が揃うので消える。GRB 
 B を右から入れる。GRBB 
 この時B が揃うので消える。GR 
 G を左から入れる。GGR 
 この時G が揃うので消える。R 
 B を左から入れる。BR 
 R を右から入れる。BRR 
 この時R が揃うので消える。B 
 よってB が1つ残るので、答えは1である
+ 
SourceCode 
import java.util.Scanner; 
//import java.util.stream.IntStream; 
/** 
* Created by nullzine on 2014/11/24. 
*/ 
public class Main { 
public static void main(String[] args){ 
Scanner sc = new Scanner(System.in); 
int n = Integer.parseInt(sc.nextLine()); 
String data = sc.nextLine(); 
if(data.length()==n){ 
System.out.println(new Execution(data).getAnswer()); 
}else{ 
System.out.println("ERROR"); 
} 
} 
} 
class Execution{ 
private String data; 
private String result; 
public Execution(String data){ 
this.data=deleteProcessing(data); 
result=null; 
calculation(); 
}
+ 
private void calculation(){ 
int limit = (int)Math.pow(2,data.length()-1); 
for(int e=0;e<limit;e++){ 
String comannd = bitComplement(Integer.toBinaryString(e)); 
String pipe = data.charAt(0)+""; 
for(int i=0;i<comannd.length();i++){ 
if(comannd.charAt(i)=='1'){ 
pipe=pipe+data.charAt(i+1); 
}else{ 
pipe=data.charAt(i+1)+pipe; 
} 
pipe = deleteProcessing(pipe); 
} 
if(result==null||pipe.length()<result.length()) { 
result = pipe; 
} 
} 
}
+ 
private String deleteProcessing(String str){ 
StringBuilder sb = new StringBuilder(str); 
if(2<=sb.length()) { 
for (int j = 0; j < sb.length() - 1; j++) { 
if(sb.charAt(j)==sb.charAt(j+1)){ 
sb.deleteCharAt(j); 
sb.deleteCharAt(j); 
} 
} 
} 
return sb.toString(); 
} 
private String bitComplement(String str){ 
for(int i=str.length();i<data.length()-1;i++){ 
str="0"+str; 
} 
return str; 
} 
public int getAnswer(){ 
return result.length(); 
} 
}
+
+
+
+ 
改良 
public Execution(String data){ 
this.data=deleteProcessing(data); 
result=null; 
//lambdaCalculation(); 
calculation(); 
} 
public Execution(String data){ 
this.data=data; 
result=null; 
//lambdaCalculation(); 
calculation(); 
} 
Executionクラスのコンストラクタ内で隣り合ったボールの消去処理を行う
+
+
+
+ 
結果 
 若干処理速度が改善した
+ 
グラフを描いてみた 
“RGBGGBGBRRGBRGB”の並べ方全通り
+ 
コードを書きなおした 
class FastExecution{ 
private String data; 
private String result; 
public FastExecution(String data){ 
this.data=data; 
result=calculation(data); 
} 
private String calculation(String str){ 
ArrayList<String> aList = str2List(str); 
Collections.sort(aList); 
String tmp = list2Str(aList); 
tmp=tmp.replaceAll("RR",""); 
tmp=tmp.replaceAll("GG",""); 
tmp=tmp.replaceAll("BB",""); 
return tmp; 
}
+ private String list2Str(ArrayList<String> aList){ 
StringBuilder sb = new StringBuilder(); 
for(String s:aList){ 
sb.append(s); 
} 
return sb.toString(); 
} 
private ArrayList<String> str2List(String str){ 
ArrayList<String> aList = new ArrayList<>(); 
for(int i=0;i<str.length();i++){ 
aList.add(str.charAt(i)+""); 
} 
return aList; 
} 
public int getAnswer(){ 
return result.length(); 
} 
}
+ 
Acceptしました
+ 
ソースコードはこちら 
http://ideone.com/glhuar

More Related Content

More from nullzine

第二回ミーティングスライド
第二回ミーティングスライド第二回ミーティングスライド
第二回ミーティングスライドnullzine
 

More from nullzine (11)

Meeting12
Meeting12Meeting12
Meeting12
 
Meeting11
Meeting11Meeting11
Meeting11
 
Meeting10
Meeting10Meeting10
Meeting10
 
Meeting9
Meeting9Meeting9
Meeting9
 
Meeting8
Meeting8Meeting8
Meeting8
 
Meeting7
Meeting7Meeting7
Meeting7
 
Meeting6
Meeting6Meeting6
Meeting6
 
Meeting5
Meeting5Meeting5
Meeting5
 
Meeting4
Meeting4Meeting4
Meeting4
 
第二回ミーティングスライド
第二回ミーティングスライド第二回ミーティングスライド
第二回ミーティングスライド
 
Meeting1
Meeting1Meeting1
Meeting1
 

Meeting13

  • 1. + AtCoderRegular14C ICPC AOJ Meeting 2014/11/24
  • 2. + Problem  高橋君が大好きなプラスチック製の円筒と不思議な赤青緑3色の ボールがある。 このボールはぎりぎり円筒に入れることができる大きさである。 円筒の両端を便宜上、右と左と呼ぶことにすると、左右好きな方 からボールを入れることができる。 このボールは同じ色のボールと接触すると消える性質を持ってい る。 さらに、これら3 色の複数個のボールを入れる順番のみが決まっ ている時、それぞれのボールを左右のどちらから入れるかによっ て全てのボールを入れ終わった後に残るボールの数が変化する。 3 色の複数個のボールを入れる順番のみが与えられ、最後に円筒 に残るボールの数が最小になるよう計画したとき、円筒に残る ボール数の最小値を答えよ。
  • 3. + Example  まずR を入れる。R  次にG を左から入れる。GR  B を右から入れる。GRB  G を右から入れる。GRBG  G を右から入れる。GRBGG  この時G が揃うので消える。GRB  B を右から入れる。GRBB  この時B が揃うので消える。GR  G を左から入れる。GGR  この時G が揃うので消える。R  B を左から入れる。BR  R を右から入れる。BRR  この時R が揃うので消える。B  よってB が1つ残るので、答えは1である
  • 4. + SourceCode import java.util.Scanner; //import java.util.stream.IntStream; /** * Created by nullzine on 2014/11/24. */ public class Main { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); String data = sc.nextLine(); if(data.length()==n){ System.out.println(new Execution(data).getAnswer()); }else{ System.out.println("ERROR"); } } } class Execution{ private String data; private String result; public Execution(String data){ this.data=deleteProcessing(data); result=null; calculation(); }
  • 5. + private void calculation(){ int limit = (int)Math.pow(2,data.length()-1); for(int e=0;e<limit;e++){ String comannd = bitComplement(Integer.toBinaryString(e)); String pipe = data.charAt(0)+""; for(int i=0;i<comannd.length();i++){ if(comannd.charAt(i)=='1'){ pipe=pipe+data.charAt(i+1); }else{ pipe=data.charAt(i+1)+pipe; } pipe = deleteProcessing(pipe); } if(result==null||pipe.length()<result.length()) { result = pipe; } } }
  • 6. + private String deleteProcessing(String str){ StringBuilder sb = new StringBuilder(str); if(2<=sb.length()) { for (int j = 0; j < sb.length() - 1; j++) { if(sb.charAt(j)==sb.charAt(j+1)){ sb.deleteCharAt(j); sb.deleteCharAt(j); } } } return sb.toString(); } private String bitComplement(String str){ for(int i=str.length();i<data.length()-1;i++){ str="0"+str; } return str; } public int getAnswer(){ return result.length(); } }
  • 7. +
  • 8. +
  • 9. +
  • 10. + 改良 public Execution(String data){ this.data=deleteProcessing(data); result=null; //lambdaCalculation(); calculation(); } public Execution(String data){ this.data=data; result=null; //lambdaCalculation(); calculation(); } Executionクラスのコンストラクタ内で隣り合ったボールの消去処理を行う
  • 11. +
  • 12. +
  • 13. +
  • 14. + 結果  若干処理速度が改善した
  • 16. + コードを書きなおした class FastExecution{ private String data; private String result; public FastExecution(String data){ this.data=data; result=calculation(data); } private String calculation(String str){ ArrayList<String> aList = str2List(str); Collections.sort(aList); String tmp = list2Str(aList); tmp=tmp.replaceAll("RR",""); tmp=tmp.replaceAll("GG",""); tmp=tmp.replaceAll("BB",""); return tmp; }
  • 17. + private String list2Str(ArrayList<String> aList){ StringBuilder sb = new StringBuilder(); for(String s:aList){ sb.append(s); } return sb.toString(); } private ArrayList<String> str2List(String str){ ArrayList<String> aList = new ArrayList<>(); for(int i=0;i<str.length();i++){ aList.add(str.charAt(i)+""); } return aList; } public int getAnswer(){ return result.length(); } }