zoukankan      html  css  js  c++  java
  • topcoder srm 380 div1

    problem1 link

    分类讨论。高度没有太大关系。主要看长度。

    problem2 link

    二分答案$mid$。计算每种$card$不足的部分,加起来,小于等于$min(jokers,mid)$就是合法的。

    problem3 link

    为了方便说明,以下所说的$x,y,a$分别是菱形宽度一半的平方、高度一半的平方、边长的平方。所以有$x+y=a$

    对于宽的来说,比如第一个,$y_{1}leq x_{1}$,所以$0leq y_{1}leq frac{a_{1}}{2}$

    对于高的来说,比如第二个,$y_{2}geq x_{2}$,所以$ frac{a_{2}}{2}leq y_{1}leq a_{2}$,宽和内部的高的关系为$y_{1}=y_{2}$,所以有$frac{a_{2}}{2} leq y_{1} leq a_{2}$

    同理对于第三个来说,它是宽的,所以$frac{a_{3}}{2}leq x_{3}leq a_{3}$,高和内部的宽的关系为$x_{2}=x_{3}$,所以$frac{a_{3}}{2}leq x_{3}=x_{2}=a_{2}-y_{2}=a_{2}-y_{1}leq a_{3}$,所以$a_{2}-a_{3} leq y_{1} leq a_{2}-frac{a_{3}}{2}$

    按照这个推导下去,会得到$y_{1}$的若干个区间,所有区间求交即可得到$y_{1}$最后的区间。如果区间合法,最小值就是答案。

    code for problem1

    import java.util.*;
    import java.math.*;
    import static java.lang.Math.*;
    
    public class LameKnight {
    	
    	public int maxCells(int n,int m) {
    		if(n==1) {
    			return 1;
    		}
    		else if(n==2){
    			if(m>=7) {
    				return 4;
    			}
    			else if(m>=5) {
    				return 3;
    			}
    			else if(m>=3) {
    				return 2;
    			}
    			else {
    				return 1;
    			}
    		}
    		else {
    			if(m>=7) {
    				return 3+(m-5);
    			}
    			else {
    				int result=dfs(1,1,n,m);
    				if(result>4) {
    					result=4;
    				}
    				return result;
    			}
    		}
    	}
    
    	int dfs(int x,int y,int n,int m) {
    		if(x<1||x>n||y<1||y>m) {
    			return 0;
    		}
    		int result=1;
    		result=Math.max(result,1+dfs(x+2,y+1,n,m));
    		result=Math.max(result,1+dfs(x+1,y+2,n,m));
    		result=Math.max(result,1+dfs(x-1,y+2,n,m));
    		result=Math.max(result,1+dfs(x-2,y+1,n,m));
    		return result;
    	}
    }
    

      

    code for problem2

    import java.util.*;
    import java.math.*;
    import static java.lang.Math.*;
    
    public class CompilingDecksWithJokers {
    	
    	public int maxCompleteDecks(int[] cards, int jokers) {
    		int low=0,high=1000000000;
    		int result=low;
    		while(low<=high) {
    			int mid=(low+high)>>1;
    			if(check(mid,cards,jokers)) {
    				result=Math.max(result,mid);
    				low=mid+1;
    			}
    			else {
    				high=mid-1;
    			}
    		}
    		return result;
    	}
    
    	boolean check(int mid,int[] cards,int jokers) {
    		long result=0;
    		for(int i=0;i<cards.length&&result<=jokers&&result<=mid;++i) {
    			if(cards[i]<mid) {
    				result+=mid-cards[i];
    			}
    		}
    		return result<=jokers&&result<=mid;
    	}
    }
    

      

    code for problem3

    import java.util.*;
    import java.math.*;
    import static java.lang.Math.*;
    
    public class NestedDiamonds {
    	
    	public double minHeight(int[] sides) {
    		Arrays.sort(sides);
    		final int n=sides.length;
    		for(int i=1;i<n;++i) {
    			if(sides[i]==sides[i-1]) {
    				return -1;
    			}
    		}
    		long[] a=new long[n];
    		for(int i=0;i<n;++i) {
    			a[i]=(long)sides[n-1-i]*sides[n-1-i];
    		}
    		long low=0,high=a[0];
    		for(int i=1;i<n;++i) {
    			long newlow=0,newhigh=0;
    			int sign=1;
    			for(int j=1;j<i;++j) {
    				newlow+=sign*2*a[j];
    				newhigh+=sign*2*a[j];
    				sign*=-1;
    			}
    			if((i&1)==1) {
    				newlow+=a[i];
    				newhigh+=2*a[i];
    			}
    			else {
    				newlow-=2*a[i];
    				newhigh-=a[i];
    			}
    			low=Math.max(low,newlow);
    			high=Math.min(high,newhigh);
    		}
    		if(low>high) {
    			return -1;
    		}
    		return Math.sqrt(0.5*low)*2;
    	}
    }
    

      

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/jianglangcaijin/p/7582555.html
Copyright © 2011-2022 走看看