码迷,mamicode.com
首页 > 其他好文 > 详细

topcoder srm 310 div1

时间:2017-08-13 12:30:36      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:double   一个   https   target   class   ref   node   floating   线段   

problem1 link

先计算出最上面、最下面一层,根据最上面一层的数量计算答案。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;

public class PyramidOfCubes {
	
	public double surface(int K) {
		int s=0,m=-1;
		for(int i=1;;++i) {
			if(s+i*i>=K) {
				m=i;
				break;
			}
			s+=i*i;
		}
		for(int i=m;;--i) {
			if(i*i>=K) {
				s=i;
				break;
			}
			K-=i*i;
		}
		double result=0.0;
		result+=m*m*2;
		result+=(s+m)*(m-s+1)/2*4;
		int row=(K+s-1)/s;
		int col=K>=s?s:K;
		result-=s*4-(row+col)*2;
		if(s==m) {
			result-=m*m*2-K*2;
		}
		return result;
	}
}

  

problem2 link

拿一个线段树维护中位数即可。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;

public class FloatingMedian {

	static final int N=65537;

	static class node {
		int L,R,num;
	}

	node[] A=new node[N<<2];
	int[] a=null;

	void build(int t,int L,int R) {
		A[t]=new node();
		A[t].L=L;
		A[t].R=R;
		A[t].num=0;
		if(L==R) return;
		int M=(L+R)>>1;
		build(t<<1,L,M);
		build(t<<1|1,M+1,R);
	}

	void insert(int t,int p,int d) {
		A[t].num+=d;
		if(A[t].L==A[t].R) {
			return;
		}


		int M=(A[t].L+A[t].R)>>1;



		if(p<=M) {
			insert(t<<1,p,d);
		}
		else {
			insert(t<<1|1,p,d);
		}
	}



	int get(int t,int k) {
		if(A[t].L==A[t].R){
			return A[t].L;
		}
		if(A[t<<1].num>=k) {
			return get(t<<1,k);
		}
		return get(t<<1|1,k-A[t<<1].num);
	}

	public long sumOfMedians(int seed, int mul, int add, int n, int K) {


		a=new int[n+1];
		a[1]=seed;
		for(int i=2;i<=n;++i) {
			a[i]=(int)(((long)a[i-1]*mul+add)&65535);
		}

		build(1,0,N-1);
		long result=0;
		final int T=(K+1)>>1;
		for(int i=1;i<=n;++i) {
			insert(1,a[i],1);
			if(i>=K) {
				result+=get(1,T);
				insert(1,a[i-K+1],-1);
			}
		}
		return result;
	}
}

problem3 link

f[S][k][t]表示已经选择的块的集合为$S$,最上面一个是第$k$块,$t$表示朝下的面的类型,有三种。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;

public class BoxTower {

	int[][][] f=null;

	int getheight(int[] x,int[] y,int[] z,int k,int t) {
		if(t==0) {
			return z[k];
		}
		else if(t==1) {
			return y[k];
		}
		else {
			return x[k];
		}
	}

	boolean check(int[] x,int[] y,int[] z,int k1,int t1,int k2,int t2) {
		int r1=t1==2?y[k1]:x[k1];
		int c1=t1==0?y[k1]:z[k1];
		int r2=t2==2?y[k2]:x[k2];
		int c2=t2==0?y[k2]:z[k2];
		return r1>=r2&&c1>=c2||r1>=c2&&c1>=r2;
	}

	public int tallestTower(int[] x, int[] y, int[] z) {
		final int n=x.length;
		f=new int[1<<n][n][3];
		for(int i=0;i<(1<<n);++i) {
			for(int j=0;j<n;++j) {
				if((i&(1<<j))!=0) {
					continue;
				}
				if(i==0) {
					f[1<<j][j][0]=getheight(x,y,z,j,0);
					f[1<<j][j][1]=getheight(x,y,z,j,1);
					f[1<<j][j][2]=getheight(x,y,z,j,2);
					continue;
				}
				for(int k=0;k<n;++k) {
					if((i&(1<<k))==0) {
						continue;
					}
					for(int t1=0;t1<3;++t1) {
						for(int t2=0;t2<3;++t2) {
							if(check(x,y,z,k,t1,j,t2)) {
								int t=f[i][k][t1]+getheight(x,y,z,j,t2);
								f[i|1<<j][j][t2]=Math.max(f[i|1<<j][j][t2],t);
							}
						}
					}
				}
			}
		}
		int result=0;
		for(int i=0;i<(1<<n);++i) {
			for(int j=0;j<n;++j) {
				for(int k=0;k<3;++k) {
					result=Math.max(result,f[i][j][k]);
				}
			}
		}
		return result;
	}
}

  

topcoder srm 310 div1

标签:double   一个   https   target   class   ref   node   floating   线段   

原文地址:http://www.cnblogs.com/jianglangcaijin/p/7352701.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!