杭电OJ第十五届ACM第一题 Hearthstone

Problem Description

  Cdfpysw loves playing a card game called "Hearthstone".
  Now he has N cards, he wants to split these cards into 4 piles. Let‘s assume the number of cards in each pile is a1, a2, a3, a4.
  It must be satisfied that:
    a1 * k1 = a2 + a3 + a4
    a2 * k2 = a1 + a3 + a4
    a3 * k3 = a1 + a2 + a4
    a1, a2, a3, a4 must be positive
  Because Cdfpysw is clever, there must be a way to split there card. Can you tell Cdfpysw what is the way?

Input

  The first line is an integer T, means the number of cases.
  Then T lines, each line contains 4 integers, N, k1, k2, k3, meaning of these have been shown in the description.
  T <= 100
  1 <= N <= 109
  1 <= k1, k2, k3 <= 200

Output

  For each case, you should output "Case #i: " first, i is the case number.
  Then output 4 integers a1, a2, a3, a4, represent the number of cards in each pile.

Sample Input

1
120 2 3 4

Sample Output

Case #1: 40 30 24 26
import java.util.Scanner;

public class Hearthstone {
	public static int[] a = {1,1,1,1,1};
	//基于深度搜索优先的回溯法
	public static void DFS(int deep,int n,int[] k,int i){
		if(a[1] == n) return;

		if(a[deep]==n){
				//当子节点遍历到n,回溯
				a[deep-1]++;
				DFS(deep-1,n,k,i);
		}
		//到第四层,若有解输出并返回,无解则继续向右
		if(deep == 4){
			if((a[1]+a[2]+a[3]+a[4]) == n){
				System.out.println("case #"+i+": "+a[1]+" "+a[2]+" "+a[3]+" "+a[4]);
				return;
			}
			else{
				a[deep]++;
				DFS(deep,n,k,i);
			}
		}
		//满足条件便往下搜索,不满足则剪枝
		if(a[deep] < n && deep < 4){
			if(a[deep]*k[deep-1] == (n-a[deep])){
				DFS(deep+1,n,k,i);
			}
			else{
				a[deep]++;
				DFS(deep,n,k,i);
			}
		}
	}
	public static void main(String[] args) {
		int T;
		int n[] = new int[100];
		int k1[] = new int[100];
		int k2[] = new int[100];
		int k3[] = new int[100];
		int a=1,b=1,c=1,d=1;
		Scanner scanner = new Scanner(System.in);
		T = scanner.nextInt();
		for(int i = 1;i <= T;i++){
			n[i] = scanner.nextInt();
			k1[i] = scanner.nextInt();
			k2[i] = scanner.nextInt();
			k3[i] = scanner.nextInt();

		}
		//对每一组实例进行求解
		for(int i = 1;i <= T;i++){
			int[] k = {k1[i],k2[i],k3[i]};
			DFS(1,n[i],k,i);
		}
		//刚开始用的五层大循环。。醉了
		/*for(int i = 1;i <= T;i++){
			for(a = 1;a<=n[i];a++){
				if(a*k1[i] == (n[i]-a))
				for(b = 1;b<=n[i]-a;b++){
					if(b*k2[i] == (n[i]-b))
					for(c = 1;c<=n[i]-a-b;c++){
						if(c*k3[i] == (n[i]-c))
						for(d = 1;d<=n[i]-a-b-c;d++){
							if((a+b+c+d) == n[i]){
								System.out.println("case #"+i+": "+a+" "+b+" "+c+" "+d);

							}
						}
					}
				}
			}
		}*/
	}

}
时间: 2024-10-05 04:58:24

杭电OJ第十五届ACM第一题 Hearthstone的相关文章

『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧,用心在自己的研究上.晚上级会开完也就八点多了,开始打打题,今天在HDU杭电的ACM集训题看到一个奇葩的题,前来献上. 今日推荐: <全球风暴> 一部宇宙航空和地球气候片的良心佳作,后期特效建模都是特别杠杠的大片,不会让你失望的哟,我已经三刷了哈哈哈.这部片在爱奇艺有上线,有兴趣的朋友可以看看鸭.

杭电OJ(HDU)-ACM Steps-Chapter Two-《Biker&#39;s Trip Odometer》《Climbing Worm》《hide handkerchief》《Nasty Hac》

1.2.1 Biker's Trip Odometer #include<stdio.h> #include<math.h> const double PI=acos(-1.0); /* 计算题,根据公式做就行,PI*d*r/(12*5280);res1/t*3600; Sample Input 26 1000 5 27.25 873234 3000 26 0 1000 Sample Output Trip #1: 1.29 928.20 Trip #2: 1179.86 1415

杭电OJ(HDU)-ACMSteps-Chapter Two-《An Easy Task》《Buildings》《decimal system》《Vowel Counting》

http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=2 1.2.5 #include<stdio.h> /* 题意:找闰年. if((i%4==0 && i%100!=0) || i%400==0)count++; 3 2005 25 1855 12 2004 10000 2108 1904 43236 */ int main() { int t,y,n; int i,count=0; whil

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse&amp;#39; Trade》《今年暑假不AC》《排名》《开门人和关门人》

http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=3 1.3.1 FatMouse' Trade #include <algorithm> /* 题意:价值/代价的比值来排序,买比值大的. Sample Input 5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1 Sample Output 13.333 31.500 */ #include<stdio.h>

杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse&#39; Trade》《今年暑假不AC》《排名》《开门人和关门人》

http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=3 1.3.1 FatMouse' Trade #include <algorithm> /* 题意:价值/代价的比值来排序,买比值大的. Sample Input 5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1 Sample Output 13.333 31.500 */ #include<stdio.h>

2017第十五届中国国际工业炉及热处理技术展览会

The 15h China International Industrial Furnaces Exhibitio 时间:2017年6月13日-16日 地点:上海新国际博览中心 上海市浦东新区龙阳路2345号 主办单位: 中国铸造协会 中国机械工程学会 中国钢铁工业协会 中国国际贸易促进委员会冶金行业分会 国内承办: 中国机械工程学会工业炉分会 国外承办:汉诺威米兰展览(上海)有限公司 基本信息: ──国际展览联盟 (UFI) 认证的国际知名展览会 ──世界第二大冶金及金属热加工展览会 ──每届

杭电 OJ 提交代码需要注意的问题

杭电acm 提交代码需要注意的问题 1. 用 Java 的时候类名请用 Main 2. Java 提交出现 PE 的可能原因有 1) 最基本的错误是空格问题,比如注意每行的末尾是否输出空格 2) 用 Java 提交的时候需要注意换行是用的什么方法输出的,如果用 System.out.printf() 这个格式化输出,请使用 %n 或者 \r\n 作为转义符,而不要用 \n,也可以用 System.out.println() 输出换行 3. 对包含比较精确的数字计算最好使用 C/C++ 语言,对于

杭电oj 1009 FatMouse&#39; Trade

Tips:本题采用贪心算法,类似于背包问题,关键在于读入数据之后,将数据按 J[i]/F[i] 从大到小排列即可. 1 /**本程序主要采用贪心算法思想,类似于背包问题*/ 2 #include<stdio.h> 3 #include<string.h> 4 int main() 5 { 6 int M,N; 7 while(scanf("%d %d",&M,&N)) 8 { 9 if(M == -1 && N == -1) 10