Chapter05-Multiple(POJ 1465)
来源:互联网 发布:知乎加载不出图片 编辑:程序博客网 时间:2024/05/17 01:18
Multiple
Time Limit: 1000MS
Memory Limit: 32768K
Total Submissions: 5911
Accepted: 1284
Description
a program that, given anatural number N between 0 and 4999 (inclusively), and M distinct decimaldigits X1,X2..XM (at least one), finds the smallest strictly positive multipleof N that has no other digits besides X1,X2..XM (if such a multiple exists).
Input
The input has several datasets separated by an empty line, each data set having the following format:
On the first line - the number N
On the second line - the number M
On the following M lines - the digits X1,X2..XM.
Output
For each data set, the programshould write to standard output on a single line the multiple, if such amultiple exists, and 0 otherwise.
An example of input and output:
Sample Input
22
3
7
0
1
2
1
1
Sample Output
110
0
Source
SoutheasternEurope 2000
题目大意:
给定一个数N(0<=N<=4999),现在给定若干个十进制的数,能否用给定的十进制的数组成一个数,使其是N的倍数,如果存在,请求出倍数最小的数,如果不存在,请输出0;
十进制的数可以无限次重复使用,例如N=22;用7,0,1三个十进制的数可以组成110使其是22的最小的倍数;
该题必须解决两个问题:
1, 怎么判断不存在该数的倍数,也就是说在什么情况下可以停止遍历;
2, 因为数的可能大小非常大,我们不能用int来存储,那么需要怎么解决这个问题;
3, 如何保证取出的数是最小的额
取余数操作,从个位数开始,对每个数取余,若余数不为零,那么对每个余数添加增加所有的可能性,依次无线循环;何时结束呢?就是取余的时候,如果发现该余数已经是第二次出现了,那么可以丢弃,因此也就是说,最多需要遍历4999次,把所有的余数都取了一遍;
存数,我们可以用数组来存储每一位数,不妨新建一个类,每一种组合新建一个类;类包含成员prev,指向上一个数,打个比方,首次遍历 分别为数1,7新建一个类,他们的prev指向空,数1又能衍生出3个类,数1,0,7,此时他们的prev分别指向数1;同时也要有成员modNum保存当前的余数,也要有一个成员currentNum表示当前的数是多少。
为了保证取出的数是最小的,我们给这些十进制的数排序,每次取数从小开始取数,因为是fifo队列,所以总是从最小的计算;
开始动手写代码吧。。。
Java代码如下:
import java.io.BufferedInputStream;import java.util.ArrayList;import java.util.Arrays;import java.util.LinkedList;import java.util.Scanner;public class Main {// 用来标记所有的余数,比如余数32,可以表示allModNum[32]=1;表示已经存在private int[] allModNum;// 这是存放十进制数的数组;private int[] number;private int N;public Main(int N) {this.N = N;if (N != 0) {allModNum = new int[N];Arrays.fill(allModNum, 0);}}public static void main(String[] args) {// TODO Auto-generated method stubScanner cin = new Scanner(new BufferedInputStream(System.in));int N ;while (cin.hasNext()) {N = cin.nextInt();Main ma = new Main(N);int countNum;countNum = cin.nextInt();ma.number = new int[countNum];for (int i = 0; i < countNum; i++) {ma.number[i] = cin.nextInt();}ma.processItBfsAndPrint();}}private void processItBfsAndPrint() {// TODO Auto-generated method stub// 辅助实现的队列;LinkedList<Node> al = new LinkedList<Node>();Arrays.sort(number);// 这个事特例哈;if (N == 0) {System.out.println(0);return;}Arrays.fill(allModNum, 0);if (number[0] != 0) {if (number[0] % N == 0) {System.out.println(number[0]);return;}al.add(new Node(null, number[0] % N, number[0]));allModNum[number[0] % N] = 1;}for (int i = 1; i < number.length; i++) {if (number[i] % N == 0) {System.out.println(number[i]);return;}al.add(new Node(null, number[i] % N, number[i]));allModNum[number[i] % N] = 1;}Node nodetemp;int modTemp;while (al.size() > 0) {nodetemp = al.remove();for (int i = 0; i < number.length; i++) {modTemp = (nodetemp.modNum * 10 + number[i]) % N;// 这就是我们需要的值;if (modTemp == 0) {// 用来暂时保存所有的值ArrayList<Integer> ans = new ArrayList<Integer>();ans.add(number[i]);while (nodetemp != null) {ans.add(nodetemp.currentNum);nodetemp = nodetemp.prev;}for (int j = ans.size() - 1; j >= 0; j--) {System.out.print(ans.get(j));}System.out.println();return;}if (allModNum[modTemp] == 0) {allModNum[modTemp] = 1;al.add(new Node(nodetemp, modTemp, number[i]));}}}System.out.println(0);}static class Node {private Node prev;private int modNum;private int currentNum;public Node(Node prev, int modNum, int currentNum) {this.prev = prev;this.modNum = modNum;this.currentNum = currentNum;}}}
- Chapter05-Multiple(POJ 1465)
- chapter05—Channel Allocation(POJ 1129)
- chapter05—Alien Security(POJ 1130)
- chapter05-Knight Moves(Poj 1915)
- Chapter05-Erdos Numbers(POJ 1391)
- Chapter05-Maze (Poj )
- chapter05-Hike on a Graph(POJ 2415)
- Chapter05-The Game(POJ 1101)
- poj 1465 Multiple (bfs+取余判重)
- POJ:1465 Multiple(bfs+剪枝)
- POJ 1465 Multiple
- POJ 1465 Multiple BFS
- POJ-1465-Multiple
- poj 1465 Multiple (BFS)
- POJ 1465 Multiple
- POJ 1465 Multiple
- POJ-1465 Multiple
- poj 1465 Multiple
- 日志重播分析
- Leetcode_n-queens-ii
- 变更车道
- 通过路口
- 2014-4-7~2014-4-13工作总结
- Chapter05-Multiple(POJ 1465)
- (转)打造属于自己的Notepad++
- FontPath “unix/:7100
- Algorithm学习笔记 --- 最快最简单的排序(桶排序)
- 靠边停车
- 内存泄露检测
- cocos2dx对精灵的优化
- 通过人行横道线
- 编程之美2014 资格赛 大神与三位小伙伴