poj 3274 Gold Balanced Lineup

来源:互联网 发布:七彩网络下载 编辑:程序博客网 时间:2024/05/17 01:12

稍微有点难想。。。用一个数组向量来表示当前的状态,向量可以化简比如 222其实就是000

然后如果两个向量相等,那么两个向量之间的feature是一样多的

写了一个巨慢的哈希数组跑了7秒

import java.io.*;import java.math.BigDecimal;import java.math.BigInteger;import java.util.*;class problem2{    int n,k;    int arr[];    int table[][];    String hash[];    int pos[];    int result = 0;    void solver() throws IOException{        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));                StringTokenizer st = new StringTokenizer(reader.readLine());        n = Integer.valueOf(st.nextToken());        k = Integer.valueOf(st.nextToken());        arr = new int[n+1];        hash = new String[n+1];        pos = new int[n+1];        for(int i=1;i<=n;i++){            arr[i] = Integer.valueOf(reader.readLine());        }        table = new int[n+1][k];        hash(table[0],0);        for(int i=1;i<=n;i++){            int min = 99999;            for(int j=k-1;j>=0;j--){                table[i][j]=table[i-1][j];                if((arr[i]&(1<<(k-1-j)))>0) table[i][j]+=1;                if(table[i][j]<min) min = table[i][j];            }            if(min>0){                for(int j=k-1;j>=0;j--)                    table[i][j]-=min;            }            int tmp = hash(table[i],i);            if(tmp>result) result=tmp;        }        //Dumper.print_2_arr(table, n, k);        System.out.println(result);    }    int hash(int arr[], int p){        String t = "";        for(int i=0;i<arr.length;i++){            t+=arr[i];        }        int index = t.hashCode();        if(index<0) index = 0-index;        index%=n;        while(hash[index]!=null){            if(t.equals(hash[index])) return p-pos[index];            else if(index==hash.length-1) index=0;            else index++;        }        hash[index]=t;        pos[index]=p;        return -1;    }}public class Main{    public static void main (String [] args) throws Exception {        problem2 p = new problem2();        p.solver();    }}


0 0
原创粉丝点击