80分求调!!!

P1618 三连击(升级版)

liaoxiangkui @ 2024-11-30 20:17:33

#include<bits/stdc++.h>
using namespace std;
int b[10];
void go(int x){
    while(x){
        b[x%10]=1;
        x/=10;
    }
}
bool check(int x,int y,int z){
    memset(b,0,sizeof(b));
    if(y>1000||z>1000){
        return 0;
    }
    go(x);
    go(y);
    go(z);
    for(int i=1;i<=9;i++){
        if(b[i]==0){
            return 0;
        }
    }
    return 1;
}
int main (){
    int A,B,C,x,y,z,sum=0;
    cin>>A>>B>>C;
    for(int i=123;i<=978;i++){
        x=i,y=i*B,z=i*C;
        if(check(x,y,z)){
            cout<<x<<" "<<y<<" "<<z<<" "<<endl;
            sum++;
        }
    } 
    if(sum==0) cout<<"No!!!";
    return 0;
}

by 123rrc @ 2024-11-30 21:22:25

提供一组 hack 数据:

input:

981 234 567

answer:

981 234 567

你的程序会输出 No!!!,原因是你没有考虑到 A,B,C 可能很大,导致 上述偷懒写法中 i \times Bi \times C 直接漏掉了正确答案。

正确的写法应该是枚举 i(从 1999),检验 i\times A,i\times B,i\times C 是否是一组解。


by 123rrc @ 2024-11-30 21:49:39

修正:若存在 A=1111,B=2222,C=3333 之类的毒瘤数据,则上述做法仍然不能通过,需要先将 A,B,C 同时除去 \gcd(A,B,C)。不过实际数据中似乎并没有这种情况。


by lichengxi1 @ 2024-12-08 09:11:01

x=i,y=i*B,z=i*C;

这是啥?不应该是x=i*A,y=i*B,z=i*C


|