题意:给出长为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());
}
}