HDU5914枚举

题意:给出长为1,2,...n的木棍,求最少移出多少条木棍,使得余下的木棍不能构成三角形(余下的木棍中取3条)


暴力枚举+打表

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) {
    	new Task().solve(); ; 
    }
}

class  Task{  
	Scanner in = new Scanner(new BufferedInputStream(System.in)) ;
	PrintWriter out = new PrintWriter(System.out) ;
	static int[] dp = new int[21] ;
	
	static{
		dp[1]=0;
		dp[2]=0;
		dp[3]=0;
		dp[4]=1;
		dp[5]=1;
		dp[6]=2;
		dp[7]=3;
		dp[8]=3;
		dp[9]=4;
		dp[10]=5;
		dp[11]=6;
		dp[12]=7;
		dp[13]=7;
		dp[14]=8;
		dp[15]=9;
		dp[16]=10;
		dp[17]=11;
		dp[18]=12;
		dp[19]=13;
		dp[20]=14;
	}
	void solve(){
		int t = in.nextInt() ;
		for(int ca = 1 ; ca <= t ; ca++){
			out.println("Case #" + ca + ": " +dp[in.nextInt()])  ;
		}
		out.flush() ; 
	}
	
	int calc(int n){
		int res = n ;
		int limit = 1<<n ;
		List<Integer> len = new ArrayList<Integer>() ;
		for(int i = 0 ; i < limit ; i++){
			int remove = 0 ;
			len.clear() ; 
			for(int j = 0 ; j < n ; j++){
				if((i & (1<<j)) > 0){
					remove++ ;
				}
				else len.add(j+1) ;
			}
			if(! can(len)) res = Math.min(res , remove) ;
		}
		return res ;
	}
	
	boolean can(List<Integer> len){
		int m = len.size() ;
		for(int a = 0 ; a < m ; a++){
			for(int b = a+1 ; b < m ; b++){
				for(int c = b+1 ; c < m ; c++){
					if(can(len.get(a) , len.get(b) , len.get(c))) 
						return true; 
				}
			}
		}
		return false ; 
	}
	
	boolean can(int a , int b , int c){
		return  (a + b > c) && (Math.abs(a - b) < c)
			||	(a + c > b) && (Math.abs(a - c) < b)
			||	(b + c > a) && (Math.abs(b - c) < a) ;
	}
} 

class InputReader {  
    public BufferedReader reader;  
    public StringTokenizer tokenizer;  
  
    public InputReader(InputStream stream) {  
        reader = new BufferedReader(new InputStreamReader(stream), 32768);  
        tokenizer = new StringTokenizer("");  
    }  
  
    private void eat(String s) {  
        tokenizer = new StringTokenizer(s);  
    }  
  
    public String nextLine() {  
        try {  
            return reader.readLine();  
        } catch (Exception e) {  
            return null;  
        }  
    }  
  
    public boolean hasNext() {  
        while (!tokenizer.hasMoreTokens()) {  
            String s = nextLine();  
            if (s == null)  
                return false;  
            eat(s);  
        }  
        return true;  
    }  
  
    public String next() {  
        hasNext();  
        return tokenizer.nextToken();  
    }  
  
    public int nextInt() {  
        return Integer.parseInt(next());  
    }  
  
    public long nextLong() {  
        return Long.parseLong(next());  
    }  
  
    public double nextDouble() {  
        return Double.parseDouble(next());  
    }  
  
    public BigInteger nextBigInteger() {  
        return new BigInteger(next());  
    }  
  
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值