Codevs 1229 数字游戏

1229 数字游戏

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 白银 Silver
 
 
题目描述 Description
Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间。  这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两个数字X和K。Lele要做的事情就是重新拼这些纸牌,组成数字 T ,并且 T + X 是 K 的正整数倍。 有时候,当纸片很多的时候,Lele经常不能在一节课之内拼出来,但是他又想知道答案,所以,他想请你帮忙写一个程序来计算答案。  
输入描述 Input Description
  1. 第一行包含两个整数 N和M(0<N<9,0<M<2000),分别代表纸片的数目和询问的数目。  
  2. 第二行包含N个整数分别代表纸片上写的数字,每个数字可能取0~9。  
  3. 接下来有M行询问,每个询问给出两个整数X和K(0<=x<10^9,0<K<100)。 
输出描述 Output Description
  1. 对于每次询问,如果能够用这些纸片拼出符合答案的T,就输出结果T。如果有多个结果,就输出符合要求的最小的T。  
  2. 如果不能拼出,就输出"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;
        }
    }
}
点击展开

 

posted @ 2016-12-24 20:56  杀猪状元  阅读(287)  评论(0编辑  收藏  举报