这一题真是做了好久。。。
首先是算法搞错了,因为之前没有做过hash的题目,所以也没有想到这种方法。
后来看了AC大牛的方法,又想了好久,终于理解了。。。。
再后来又由于没有看清楚题目,注意:在拼纸片的时候,每张纸片都必须用上,且T首位不能为0,而WA了几次。。。
AC牛去年2月就A了这题。。。。
这题主要是用hash表来保存算出的数据,为什么要这样想,因为题目0<K<100。
/* * File: main.cpp * Author: cc * * Created on May 12, 2010, 2:30 PM */ #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> using namespace std; int main() { int n, m; char nums[9]; int i, j; int hash[105][105]; int num; int x, k; while (scanf("%d%d", &n, &m) != EOF) { for (i = 0; i < 105; i++) for (j = 0; j < 105; j++) { hash[i][j] = -1; } for (i = 0; i < n; i++) scanf("%s", &nums[i]); sort(nums, nums + n); do { if(nums[0] == '0') continue; num = atoi(nums); for (i = 1; i < 100; i++) { if (hash[num % i][i] == -1) hash[num % i][i] = num; } } while (next_permutation(nums, nums + n)); for (i = 0; i < m; i++) { scanf("%d%d", &x, &k); if (hash[(k - x % k) % k][k] == -1) printf("None/n"); else printf("%d/n", hash[(k - x % k) % k][k]); } } return 0; }
Number Puzzle Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 345 Accepted Submission(s): 105 Problem Description Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间。 这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两个数字X和K。Lele要做的事情就是重新拼这些纸牌,组成数字 T ,并且 T + X 是 K 的正整数倍。 有时候,当纸片很多的时候,Lele经常不能在一节课之内拼出来,但是他又想知道答案,所以,他想请你帮忙写一个程序来计算答案。 Input 本题目包含多组测试数据,请处理到文件结束。 每组数据第一行包含两个整数 N和M(0<N<9,0<M<2000),分别代表纸片的数目和询问的数目。 第二行包含N个整数分别代表纸片上写的数字,每个数字可能取0~9。 接下来有M行询问,每个询问给出两个整数X和K(0<=x<10^9,0<K<100)。 注意:在拼纸片的时候,每张纸片都必须用上,且T首位不能为0 Output 对于每次询问,如果能够用这些纸片拼出符合答案的T,就输出结果T。如果有多个结果,就输出符合要求的最小的T。 如果不能拼出,就输出"None"。 Sample Input 4 3 1 2 3 4 5 7 33 6 12 8 Sample Output 1234 None 1324