Codevs 1229 数字游戏
1229 数字游戏
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 白银 Silver
题目描述 Description
Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间。 这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两个数字X和K。Lele要做的事情就是重新拼这些纸牌,组成数字 T ,并且 T + X 是 K 的正整数倍。 有时候,当纸片很多的时候,Lele经常不能在一节课之内拼出来,但是他又想知道答案,所以,他想请你帮忙写一个程序来计算答案。
输入描述 Input Description
- 第一行包含两个整数 N和M(0<N<9,0<M<2000),分别代表纸片的数目和询问的数目。
- 第二行包含N个整数分别代表纸片上写的数字,每个数字可能取0~9。
- 接下来有M行询问,每个询问给出两个整数X和K(0<=x<10^9,0<K<100)。
输出描述 Output Description
- 对于每次询问,如果能够用这些纸片拼出符合答案的T,就输出结果T。如果有多个结果,就输出符合要求的最小的T。
- 如果不能拼出,就输出"None"。
样例输入 Sample Input
4 3
1 2 3 4
5 7
33 6
12 8
样例输出 Sample Output
1234
None
1324
数据范围及提示 Data Size & Hint
传送门 点此展开
满分做法是全排列,也不知为啥这题数据能让9!*2000过,可能出题人比较良心吧。。
代码如下
#include <algorithm> #include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> #define INF 1111111111 using namespace std; bool f; int minn=INF,ans,s[11],z,q,maxn,cs[19],cs1[19],b,t,r,w,x,k,a,n,m,i,j; int main() { ios::sync_with_stdio(false); int c; cin >> n >> m; int p; for(i=0;i<n;++i) { cin>>p; s[i]=p; } for(j=0;j<m;++j) { cin>>x>>k; f=false; minn=INF; do{ int v=n; ans=0; for(i=0;i<n;++i) { if(i==0) ans=s[i]; else ans=ans*10+s[i]; } if((ans+x)%k==0) { minn=min(minn,ans); f=true; } } while (next_permutation(s,s+n)); if(!f) cout<<"None"<<endl; else cout<<minn<<endl; } }
80分暴力 每个大于10^(n-1)小于10^(n-1)*maxn倍数进行枚举 再看看出现次数是否一致
仅供参考,最后一点跑1分钟能跑出来。。
代码
#include <iostream> #include <cstring> #include <string> #include <cstdio> #include <cmath> using namespace std; bool f; char s[100000001]; int z,q,maxn,cs[19],cs1[19],b,t,r,w,x,k,a,n,m,i,j; int Pd(int k) { memset(cs1,0,sizeof(cs1)); sprintf(s,"%d",k); for (j = 0; j < strlen(s); ++j) cs1[s[j]-48]++; for(j = 1; j<=9 ;++j) { if(cs1[j]!=cs[j]) return 0; } return 1; } int main() { ios::sync_with_stdio(false); int c; cin >> n >> m; z = pow(10,n-1); for (i = 0 ;i < n ;++i) { cin >> a; cs[a]++; maxn = max(maxn,a); } b = z * (maxn+1); for (i = 0 ;i < m ;++i) { f=false; cin >> x >> k; q=z/k; int c=b/k+1; while(q<c) { ++q; t=k*q-x; if(Pd(t)) { f=true; cout << t <<endl; break; } } if(!f) { cout << "None" << endl; } } }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。