■A. FreeCell Statistics
まず,下記の2条件を満たすか調べる.・PG=0の時は,PD=0でないといけない.
何故なら,PG=0ならば,全てのゲームで負けているから.
・PG=100の時は,PD=100でないといけない.
理由は上とほぼ同じ.
次に,勝率がPD[%]となる(今日の)最小のゲーム数を求める.
つまり,
PD/100*Dが整数となるような,最小のDを求める.
つまり,
D=100/gcd(PD,100)
である.
D≦Nならば,"Possible".
PGについては,試合の勝敗を調整すれば基本的に実現可能.
import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
public class A{
Scanner sc=new Scanner(System.in);
int INF=1<<28;
double EPS=1e-9;
int caze;
int t;
long n, nd, ng;
void run(){
t=sc.nextInt();
for(caze=1; caze<=t; caze++){
n=sc.nextLong();
nd=sc.nextLong();
ng=sc.nextLong();
solve();
}
}
void solve(){
long dd=100;
long dg=100;
if(ng==0&&nd>0){
answer("Broken");
return;
}
if(ng==100&&nd<100){
answer("Broken");
return;
}
long gcdD=gcd(nd, dd);
long gcdG=gcd(ng, dg);
debug(gcdD, gcdG);
nd/=gcdD;
dd/=gcdD;
ng/=gcdG;
dg/=gcdG;
debug(nd, dd, ng, dg);
long d=dd;
if(d>n){
answer("Broken");
return;
}
answer("Possible");
}
void answer(String s){
println("Case #"+caze+": "+s);
}
long gcd(long m, long n){
for(; n!=0;){
long t=m%n;
m=n;
n=t;
}
return m;
}
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){
try{
System.setIn(new FileInputStream(
"D:/contest_workspace/gcj_2011_round1a/dat/A-large.in"));
System.setOut(new PrintStream(new FileOutputStream(
"D:/contest_workspace/gcj_2011_round1a/dat/A-large.out")));
}catch(Exception e){}
new A().run();
System.out.flush();
System.out.close();
}
}
■B. The Killer Word
大雑把な方針は,DFSです.まず,辞書単語を文字列の長さで分類します.
そして,リストの文字を順番に辞書全体に適用していきます.
その際,それぞれの辞書単語の開示状態は変わります.
この開示状態が等しいもので分類して,その集合で個々にDFSを行います.
集合の要素数が1になったら終わりです.
詳しい説明は,GCJ公式のContest Analysisを御覧下さい.
ちなみに,本番では解けませんでした.
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 B{
Scanner sc=new Scanner(System.in);
int INF=1<<28;
double EPS=1e-9;
int caze;
int m, n;
String[] dic, lis;
String l;
int[] bit;
int[] opend;
int[][] open;
int[] loses;
void run(){
int tt=sc.nextInt();
for(caze=1; caze<=tt; caze++){
m=sc.nextInt();
n=sc.nextInt();
dic=new String[m];
lis=new String[n];
for(int i=0; i<m; i++){
dic[i]=sc.next();
}
for(int i=0; i<n; i++){
lis[i]=sc.next();
}
solve();
}
}
void dfs(TreeSet<Integer> set, int k, int exist){
if(set.size()<=1||k>=26){
return;
}
if(((exist>>(l.charAt(k)-'a'))&1)==0){
dfs(set, k+1, exist);
return;
}
HashMap<Integer, TreeSet<Integer>> map=new HashMap<Integer, TreeSet<Integer>>();
HashMap<Integer, Integer> exists=new HashMap<Integer, Integer>();
for(int i : set){
opend[i]|=open[i][l.charAt(k)];
if(open[i][l.charAt(k)]==0){
loses[i]++;
}
if(!map.containsKey(opend[i])){
map.put(opend[i], new TreeSet<Integer>());
exists.put(opend[i], 0);
}
map.get(opend[i]).add(i);
exists.put(opend[i], exists.get(opend[i])|bit[i]);
}
for(Entry<Integer, TreeSet<Integer>> entry : map.entrySet()){
dfs(entry.getValue(), k+1, exists.get(entry.getKey()));
}
}
void solve(){
String ans="";
for(int k=0; k<n; k++){
TreeSet<Integer>[] sets=new TreeSet[10];
for(int i=0; i<10; i++){
sets[i]=new TreeSet<Integer>();
}
bit=new int[m];
opend=new int[m];
open=new int[m][256];
loses=new int[m];
int[] exists=new int[10];
for(int j=0; j<m; j++){
sets[dic[j].length()-1].add(j);
for(int i=0; i<dic[j].length(); i++){
bit[j]|=1<<(dic[j].charAt(i)-'a');
open[j][dic[j].charAt(i)]|=1<<i;
exists[dic[j].length()-1]|=1<<(dic[j].charAt(i)-'a');
}
}
l=lis[k];
for(int i=0; i<10; i++){
dfs(sets[i], 0, exists[i]);
}
int max=-1;
for(int i=0; i<m; i++){
max=max(max, loses[i]);
}
for(int i=0; i<m; i++){
if(loses[i]==max){
ans+=dic[i]+(k==n-1?"":" ");
break;
}
}
}
answer(ans);
debug(ans);
}
void answer(String s){
println("Case #"+caze+": "+s);
}
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){
try{
System.setIn(new FileInputStream(
"D:/contest_workspace/gcj_2011_round1a/dat/B-large.in"));
System.setOut(new PrintStream(new FileOutputStream(
"D:/contest_workspace/gcj_2011_round1a/dat/B-large.out")));
}catch(Exception e){}
new B().run();
System.out.flush();
System.out.close();
}
}
■Result
oo----20pts. 870th
どうにかRound2へ進出出来ます.
0 件のコメント:
コメントを投稿