博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法笔记_184:历届试题 约数倍数选卡片(Java)
阅读量:7175 次
发布时间:2019-06-29

本文共 2624 字,大约阅读时间需要 8 分钟。

目录

 


1 问题描述

问题描述
  闲暇时,福尔摩斯和华生玩一个游戏:
  在N张卡片上写有N个整数。两人轮流拿走一张卡片。要求下一个人拿的数字一定是前一个人拿的数字的约数或倍数。例如,某次福尔摩斯拿走的卡片上写着数字“6”,则接下来华生可以拿的数字包括:
  1,2,3, 6,12,18,24 ....
  当轮到某一方拿卡片时,没有满足要求的卡片可选,则该方为输方。
  请你利用计算机的优势计算一下,在已知所有卡片上的数字和可选哪些数字的条件下,怎样选择才能保证必胜!
  当选多个数字都可以必胜时,输出其中最小的数字。如果无论如何都会输,则输出-1。
输入格式
  输入数据为2行。第一行是若干空格分开的整数(每个整数介于1~100间),表示当前剩余的所有卡片。
  第二行也是若干空格分开的整数,表示可以选的数字。当然,第二行的数字必须完全包含在第一行的数字中。
输出格式
  程序则输出必胜的招法!!
样例输入
2 3 6
3 6
样例输出
3
样例输入
1 2 2 3 3 4 5
3 4 5
样例输出
4
 

 

 

 


2 解决方案

 

 

具体代码如下:

 

import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;public class Main {        public int dfs(int[] numA, ArrayList
[] 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
[] listA = new ArrayList[105]; for(int i = 1;i < 105;i++) listA[i] = new ArrayList
(); ArrayList
listB = new ArrayList
(); 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); }}

 

 

 

 

 

 

 

参考资料:

   1. 

 

转载地址:http://ybbzm.baihongyu.com/

你可能感兴趣的文章
Timer定时器
查看>>
特殊字符验证,电话手机验证
查看>>
航电1863-畅通工程
查看>>
[WC2011]最大XOR和路径
查看>>
SGU - 282
查看>>
Asp.Net QRCode创建WEB二维码时遇到的问题!
查看>>
MVC与MVVM关系图解
查看>>
Redis内存数据库快速入门
查看>>
微信公众平台开发(71) 网页授权获取用户基本信息
查看>>
[原创]反汇编分析 RtlZeroMemory (RtlZeroMemory)函数
查看>>
day33——hash类型操作、其他常用操作
查看>>
得到本机名称和其IP地址和是否联网
查看>>
【Python3爬虫】你会怎么评价复仇者联盟4?
查看>>
游戏编程入门之精灵旋转和缩放(旋转行走的向日葵、行走的人物)
查看>>
js 、jq强化复习
查看>>
实现两数之间的运算
查看>>
AFNetworking 源码解读
查看>>
协程--代码注释篇
查看>>
oracle 中可以用 case when then else end来处理除数是0的情况
查看>>
SVN服务器搭建和使用(一)
查看>>