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