首页 > ACM题库 > HDU-杭电 > HDU 3141-Allergy Test[解题报告]HOJ
2014
03-03

HDU 3141-Allergy Test[解题报告]HOJ

Allergy Test

问题描述 :


Money Matters

A test for allergy is conducted over the course of several days, and consists of exposing you to dierent substances (so called allergens). The goal is to decide exactly which of the allergens you are allergic to. Each allergen has a live duration D measured in whole days, indicating exactly how many days you will suer from an allergic reaction if you are allergic to that particular substance. An allergic reaction starts to show almost immediately after you have been exposed to an allergen which you are allergic to. The test scheme has two action points per day:
    I At 8 o’clock each morning, at most one of the allergens is applied to your body.
    II At 8 o’clock each evening, you are examined for allergic reactions.

Thus an allergen with live duration D will aect exactly D allergic reaction examinations.

Of course, if you have two or more active allergens in your body at the time of an observed reaction, you cannot tell from that information only, which of the substances you are allergic to.

You want to find the shortest possible test scheme given the durations of the allergens you want to test. Furthermore, to allow simple large scale application the test scheme must be non-adaptive, i.e. the scheme should be fixed in advance. Thus you may not choose when to apply an allergen based on the outcome of previous allergic reaction examinations.

输入:

The first line of the input contains a single integer k (1 <= k <= 20) specifying the number of allergens being tested for. Then follow k lines each containing an integer D (1 <= D <= 7) specifying the live duration of each allergen.

输出:

The first line of the input contains a single integer k (1 <= k <= 20) specifying the number of allergens being tested for. Then follow k lines each containing an integer D (1 <= D <= 7) specifying the live duration of each allergen.

样例输入:

3
2
2
2
5
1
4
2
5
2

样例输出:

5
10

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


public class Main {
	//how many of type 1...7, then length of last free. stores min test day
	static Map<Key, Integer> dp;
	static int MAX = 141;
	public static void main(String[] args) throws Exception{
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter out = new PrintWriter(System.out);
		
		int T = Integer.parseInt(reader.readLine());
		for(int t = 0; t < T ; t++){
			dp = new HashMap<Key, Integer>();
			int k = Integer.parseInt(reader.readLine());
			int[] state = new int[8];
			for(int i = 0; i < k; i++){
				state[Integer.parseInt(reader.readLine())]++;
			}
			
			int min = MAX;
			for(int free = 1; free <= 7; free++){
				state[0] = free;
				min = Math.min(min, solve(new Key(state)));
			}
			out.println(min);
		}
		
		out.close();
	}
	
	static int solve(Key key){
		if(dp.get(key) != null){
			return dp.get(key);
		}
		
		int sum = 0;
		List<Integer> nonzero = new ArrayList<Integer>();
	
		int sfree = key.state[0];
		
		for(int i = 1; i <= 7; i++){
			sum += key.state[i];
			if(key.state[i] != 0) nonzero.add(i);
		}
		
		if(sum == 1){
			if(sfree == nonzero.get(0)){
				return sfree;
			}else{
				return MAX;
			}
		}
		
		int min = MAX;
		for(int i = 0; i < nonzero.size(); i++){
			int lastL = nonzero.get(i);
			if(lastL < sfree) continue;
			for(int free = 1; free <= 7; free++){
				if(lastL > sfree + free - 1) continue;
				Key nextKey = new Key(key.state.clone());
				nextKey.state[lastL]--;
				nextKey.state[0] = free;
				int ans = solve(nextKey) + sfree;
				min = Math.min(ans,  min);
			}
		}
		
		dp.put(key, min);
		
		return min;
	}
	
	static class Key{
		public int[] state;
		
		public Key(int[] state){
			this.state = state;
		}
		
		@Override
		public boolean equals(Object other){
			return Arrays.equals(this.state, ((Key)other).state);
		}
		
		@Override
		public int hashCode(){
			return Arrays.hashCode(state);
		}
		
	}
}

  1. 第2题,TCP不支持多播,多播和广播仅应用于UDP。所以B选项是不对的。第2题,TCP不支持多播,多播和广播仅应用于UDP。所以B选项是不对的。

  2. Good task for the group. Hold it up for every yeara??s winner. This is a excellent oppotunity for a lot more enhancement. Indeed, obtaining far better and much better is constantly the crucial. Just like my pal suggests on the truth about ab muscles, he just keeps obtaining much better.

  3. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。