问题标题: 酷町堂:6135 数字谜题

0
0
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

酷町猫很讨厌去邻居家做客,他在偷偷玩一个数字游戏来打发时间。
他首先拿出几张纸,上面写上0~9中的某些数字(可以重复)。然后他让邻居家的小朋友随便写两个数字x和k。酷町猫要拼凑这几张纸,组成数字t,使得t+x是k的正整数倍数。
当纸很多时,酷町猫可能找不到答案。但是他很想知道答案,请你帮他算一下。

输入描述 Input Description

第一行,两个整数,n和m,分别表示纸的数量和询问的数量
第二行,n个整数,每个数字可以取0~9
接下来m行, 每行两个整数,x和k,表示要计算的一组数据

t的首位不能为0。

输出描述 Output Description

对于每组数据,输出符合条件的t,如果有多个,输出符合条件最小的t;
如果没有,输出“None”

 

WA40

#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
long long n,m,a[15],b[362885],s=1;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		s*=i;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=s;i++){
		if(a[1]==0){
            b[i]=0x3f3f3f3f;
            next_permutation(a+1,a+1+n);
            continue;
        } 
		int sum=0;
		for(int i=1;i<=n;i++){
			sum=sum*10+a[i];
		}
		b[i]=sum;
		next_permutation(a+1,a+1+n);
	}
	while(m--){
		int k,x,f=0;
		cin>>x>>k;
		for(int i=1;i<=s;i++){
			if((b[i]+x)%k==0){
				cout<<b[i]<<endl;
				f=1;
				break;
			}
		}
		if(f==0) cout<<"None\n";
	}
	return 0;
}

 

汪恺恒在2021-03-09 13:00:50追加了内容

WA30

#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
long long n,m,a[15],num[15],x,k;
bool check(long long arr[]){
    if(arr[1]==0) return false;
	int sum=0;
	for(int i=1;i<=n;i++){
		sum=sum*10+arr[i];
	}
	if((sum+x)%k==0) return true;
	return false;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		num[i]=a[i];
	}
	while(m--){
		cin>>x>>k;
		bool f=0;
		do{
			if(check(num)){
				f=1;
				for(int i=1;i<=n;i++){
					cout<<num[i];
				}
				cout<<endl;
				break;
			}
		}while(next_permutation(num+1,num+1+n));
		if(f==0) cout<<"None\n";
		for(int i=1;i<=n;i++){
			num[i]=a[i];
		}
	} 
	return 0;

WA40

#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
long long n,m,num[15],x,k;
bool check(long long arr[]){
    if(arr[1]==0) return false;
    int sum=0;
    for(int i=1;i<=n;i++){
        sum=sum*10+arr[i];
    }
    if((sum+x)%k==0) return true;
    return false;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>num[i];
    }
    while(m--){
        cin>>x>>k;
        bool f=0;
        do{
            if(check(num)){
                f=1;
                for(int i=1;i<=n;i++){
                    cout<<num[i];
                }
                cout<<endl;
                break;
            }
        }while(next_permutation(num+1,num+1+n));
        if(f==0) cout<<"None\n";
    } 
    return 0;
}

 


0
已采纳
张帆
张帆
中级天翼
中级天翼

生成排列的方法

do{
}while(next_permutation(a+1,a+1+n));

我的思路:

对于每组x和k

遍历排列1次,遍历代码,check函数你应该会。

do{
            if(check(num)){
                for(int i=1;i<=n;i++) cout<<num[i];
                cout<<"\n";
                flag=true;
                break;
            }
        }while(next_permutation(num+1,num+1+n));
        if(flag) continue;
        cout<<"None\n";

 

 

0
0
张帆
张帆
中级天翼
中级天翼

@汪恺恒 你还少了一步,就是每次输入输入x和k的时候要

     sort(num+1,num+1+n);

 

我要回答