1610:历届试题 约数倍数选卡片
2018-03-27 22:04
337 查看
//3月25打的题目一点印象都没有...
Description
闲暇时,福尔摩斯和华生玩一个游戏:在N张卡片上写有N个整数。两人轮流拿走一张卡片。要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数。例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可以拿的数字包括:
1,2,3, 6,12,18,24 ....
当轮到某一方拿卡片时,没有满足要求的卡片可选,则该方为输方。
请你利用计算机的优势计算一下,在已知所有卡片上的数字和可选哪些数字的条件下,怎样选择才能保证必胜!
当选多个数字都可以必胜时,输出其中最小的数字。如果无论如何都会输,则输出-1。
Input
输入数据为2行。第一行是若干空格分开的整数(每个整数介于1~100间),表示当前剩余的所有卡片。第二行也是若干空格分开的整数,表示可以选的数字。当然,第二行的数字必须完全包含在第一行的数字中。
Output
程序则输出必胜的招法!!Sample Input
样例输入1 2 3 6 3 6 样例输入2 1 2 2 3 3 4 5 3 4 5
Sample Output
样例输出1 3 样例输出2 4
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main { public int dfs(int[] numA, ArrayList<Integer>[] listA, int start) { for(int i = listA[start].size() - 1;i >= 0;i--) { if(numA[listA[start].get(i)] > 0) { numA[listA[start].get(i)]--; int t = dfs(numA, listA, listA[start].get(i)); numA[listA[start].get(i)]++; if(t == -1) return 1; } } return -1; } public void getResult(String A, String B) { int[] numA = new int[105]; @SuppressWarnings("unchecked") ArrayList<Integer>[] listA = new ArrayList[105]; for(int i = 1;i < 105;i++) listA[i] = new ArrayList<Integer>(); ArrayList<Integer> listB = new ArrayList<Integer>(); String[] arrayA = A.split(" "); String[] arrayB = B.split(" "); for(int i = 0;i < arrayA.length;i++) { int a = Integer.valueOf(arrayA[i]); numA[a]++; } for(int i = 1;i <= 100;i++) { if(numA[i] != 0) { numA[i]--; for(int j = 1;j <= 100;j++) if(numA[j] != 0 && (i % j == 0 || j % i == 0)) listA[i].add(j); numA[i]++; } } for(int i = 0;i < arrayB.length;i++) { int b = Integer.valueOf(arrayB[i]); listB.add(b); } Collections.sort(listB); for(int i = 0;i < listB.size();i++) { numA[listB.get(i)]--; int t = dfs(numA, listA, listB.get(i)); numA[listB.get(i)]++; if(t == -1) { System.out.println(listB.get(i)); return; } } System.out.println("-1"); return; } public static void main(String[] args) { Main test = new Main(); Scanner in = new Scanner(System.in); String A = in.nextLine(); String B = in.nextLine(); test.getResult(A, B); } }
相关文章推荐
- 算法笔记_184:历届试题 约数倍数选卡片(Java)
- 蓝桥杯历届试题——约数倍数选卡片(博弈论+dfs)
- 历届试题 约数倍数选卡片 博弈论?dfs
- 【 历届试题 约数倍数选卡片】(博弈论)
- 蓝桥杯历届试题 约数倍数选卡片
- 蓝桥杯 历届试题 约数倍数选卡片 求大神指点 首先声明,我的代码有问题!不喜勿进,若有意向,可以讨论,我百度不到这道题的题解
- 蓝桥杯 历届试题 约数倍数选卡片 求大神指点 首先声明,我的代码有问题,!不喜勿进,若有意向,可以讨论,我百度不到这道题的题解
- 历届试题 约数倍数选卡片
- 约数倍数选卡片---博弈论
- 蓝桥杯 约数倍数选卡片
- 蓝桥杯 约数倍数选卡片
- 蓝桥杯 约数倍数选卡片
- 约数倍数选卡片 博弈论
- 历届试题 蚂蚁感冒
- 历届试题 蚂蚁感冒 (蓝桥杯)
- 算法笔记_170:历届试题 分糖果(Java)
- 算法笔记_178:历届试题 邮局(Java)
- 算法笔记_193:历届试题 连号区间数(Java)
- 蓝桥杯 - 历届试题 兰顿蚂蚁
- 蓝桥杯 历届试题 幸运数