• [全排列]--A Number Puzzle


    标签: ACM


    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

    先求出所有数字可以构成的全排列,再对这个全排列遍历比较是否符合条件
    需要注意的是自己写的递归全排列要超时,百度了一下要用next_permutation()函数模版
    next_permutation()函数自动生成下一个全排列,非常方便
    尽量把变量的作用域设置小一点,避免超时
    同时不要用cin与cout,用printf和scanf会减少大量数据读写时间

    AC代码

    #include<iostream>
    #include<stdio.h>
    #include <algorithm>
    using namespace std;
    int s[1000000];
    int num[10];
    int main()
    {
        int n,m,sum;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            for(int i=0;i<n;i++)
                scanf("%d",&num[i]);
            sort(num,num+n);
            int ok=0;
            do{
                if(num[0]!=0){
                    sum=0;
                    for(int i=0;i<n;i++)
                        sum=sum*10+num[i];
                    s[++ok]=sum;
                }
            }while(next_permutation(num,num+n));
            while(m--)
            {
                int a,b;
                scanf("%d%d",&a,&b);
                bool flag=true;
                for(int j=1;j<=ok;j++)
                {
                    if((s[j]+a)%b==0)
                    {
                        printf("%d
    ",s[j]);
                        flag=false;
                        break;
                    }
                }
                if(flag)
                    printf("None
    ");
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    androidstudio配置模拟器路径
    Linux常见命令
    逆向助手使用
    Git服务器回滚到固定版本
    Git使用
    使用本地Gradle版本
    系统模拟器创建
    AndroidStudio设置代理
    关联、参数化、思考时间、检查点、事务的设置方式
    SQL:内连接、左外连接、右外连接、全连接、交叉连接区别
  • 原文地址:https://www.cnblogs.com/allen-lzl/p/7994008.html
Copyright © 2020-2023  润新知