为什么最后一个测试点总不过 求大神指点

P1618 三连击(升级版)

Sodifficult @ 2019-11-21 11:57:57

#include <iostream>
#include <algorithm>
using namespace std;

bool f(int a,int b)
{
    int c;
    char x[4],y[4];
    x[0] = (a/100)%10+'0';
    x[1] = (a/10)%10+'0';
    x[2] = a%10+'0';
    x[3] = '\0';

    y[0] = (b/100)%10+'0';
    y[1] = (b/10)%10+'0';
    y[2] = b%10+'0';
    y[3] = '\0';

    for(int i=0;i<3;i++)
    {
        for(int j=i+1;j<3;j++)
        {
            if(x[i] == x[j] || y[i]==y[j])
            {
                return 0;
            }
        }
    }

    for(int i=0;i<3;i++)
    {
        if(x[i] == '0'|| y[i]=='0')
        {
            return 0;
        }
    }
    for(int i=0;i<3;i++)
    {
        c = b%10;
        b/=10;
        for(int j=0;j<3;j++)
        {
            if(c+'0' == x[j])
            {
                return 0;
            }
        }
    }
    return 1;
}

int main()
{
    int x,y,z,i,t = 0;
    double x1,y1,z1;
    cin>>x>>y>>z;
    z1 = z*1.0/x;
    y1 = y*1.0/x;
    x1 = x*1.0/x;
    if(z/x!=z1||y/z!=y1)
    {
        z = z;
        x = x;
        y = y;
    }
    else
    {
        z = z/x;
        y = y/x;
        x = 1;
    }
   for(i=100;i<=1000;i++)
   {
    if(f(x*i,y*i)&&f(x*i,z*i)&&f(y*i,z*i))
    {
            t = 1;
            if(x*i>=1000||y*i>=1000||z*i>=1000)
            {
                cout<<"No!!!";
                return 0;
            }
           cout<<x*i<<" "<<y*i<<" "<<z*i<<endl;
    }
   }
   if(t==0)
   {
       cout<<"No!!!"<<endl;
   }
   return 0;
}

by Sodifficult @ 2019-11-21 18:11:48

#include <iostream>
#include <algorithm>
using namespace std;

bool f(int a,int b)
{
    int c;
    char x[4],y[4];
    x[0] = (a/100)%10+'0';
    x[1] = (a/10)%10+'0';
    x[2] = a%10+'0';
    x[3] = '\0';

    y[0] = (b/100)%10+'0';
    y[1] = (b/10)%10+'0';
    y[2] = b%10+'0';
    y[3] = '\0';

    for(int i=0;i<3;i++)
    {
        for(int j=i+1;j<3;j++)
        {
            if(x[i] == x[j] || y[i]==y[j])
            {
                return 0;
            }
        }
    }

    for(int i=0;i<3;i++)
    {
        if(x[i] == '0'|| y[i]=='0')
        {
            return 0;
        }
    }
    for(int i=0;i<3;i++)
    {
        c = b%10;
        b/=10;
        for(int j=0;j<3;j++)
        {
            if(c+'0' == x[j])
            {
                return 0;
            }
        }
    }
    return 1;
}

int main()
{
    int x,y,z,i,t = 0,o=0;
    double x1,y1,z1;
    cin>>x>>y>>z;
    z1 = z*1.0/x;
    y1 = y*1.0/x;
    x1 = x*1.0/x;
    if(z/x!=z1||y/z!=y1)
    {
        z = z;
        x = x;
        y = y;
    }
    else
    {
        z = z/x;
        y = y/x;
        x = 1;
    }
   for(i=1;i<=1000;i++)
   {
    if(f(x*i,y*i)&&f(x*i,z*i)&&f(y*i,z*i))
    {
            t = 1;
            if(x*i>=1000||y*i>=1000||z*i>=1000)
            {
                if(o!=1)
                cout<<"No!!!";
                return 0;
            }
           else
           {
           cout<<x*i<<" "<<y*i<<" "<<z*i<<endl;
           o=1;
           }
    }
   }
   if(t==0)
   {
       cout<<"No!!!"<<endl;
   }
   return 0;
}

看了讨论区 已更正 这次通过了,我发现我那个for循环应该从1开始而不是100,还有就是我那个输出No!!!的条件出错了,不能只超过一千,因为还有一种情况就是开始满足小于1000,后来不满足了,就拿123 456 789来说,它会输出123 456 789 NO!!! 所以在这个地方应该特判下即可


by undefined_null @ 2019-11-22 19:59:10

可以下载数据然后if骗分


by Sodifficult @ 2019-11-25 15:28:08

@OIer_Dennis 数据怎么下?


by undefined_null @ 2019-11-25 16:52:08

@Sodifficult 尽量还是不要这么做吧……

再交一遍最后一个点错了的程序,然后进入旧版页面就可以下载最后一个数据了


by Sodifficult @ 2019-11-25 20:57:34

@OIer_Dennis 好的 但是目的不是骗分 只是想看看那种情况没有考虑到


|