uva725_一道水题(优化到了29ms)


///////////////////////////////////////////////////////////////////////////////////////////////////////
作者:tt2767
声明:本文遵循下面协议自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0
查看本文更新与讨论请点击:http://blog.csdn.net/tt2767
链接被删请百度: CSDN tt2767
///////////////////////////////////////////////////////////////////////////////////////////////////////


能够用 n * fghij 去枚举 abcde 判重就可以

由于fghij 可能自身反复较多。能够先判掉。节省时间;

假设不写成函数的形式还能更快一些。由于第二次判段中x,已经推断过了。

书中的做法是把两个数字化成字符串去。排序后推断用时
123ms

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
//////////////////////
#include<iostream>
#include<algorithm>
#include<string>
#include <iterator>
#include<sstream>
#include<functional>
#include<numeric>
///////////////////////
#include<vector>
#include<map>
#include <stack>
#include<queue>
#include<set>
#include <bitset>
#include <list>
using namespace std;
#define lch(x)  ((x) << 1)
#define rch(x) ((x)<<1|1)
#define dad(x) ((x)>>1)
#define lowbit(x) ((x)&(-x))
typedef  long long int LL;
const int INF = ~0U>>1;
const double eps = 1e-6;
const long double PI = acos(0.0) * 2.0;
//const int N = 10 + ;
const int MAX = 98765,MIN = 1234;
bool check(int x , int l1,int y ,int l2);
int main()
{
    //ios::sync_with_stdio(false);
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt", "r", stdin);
    freopen("out3.txt", "w", stdout);
#endif
    int n;
    int tot = 0;
    while(scanf("%d",&n)==1&& n)
    {
        if(tot++)  puts("");
        bool flag=1;
        for(int  i = MIN ; i<= MAX ; i++)
        {
            int l1 = log10(i)+1;
            if(!check(i,l1,-1,-1))   continue;
            int j = i*n;
            int l2 = log10(j)+1;
            if(j>MAX)       break;
            if(!check(i,l1,j,l2))   continue;
            flag = 0;
            printf("%05d / %05d = %d\n",j,i,n);
        }
        if(flag)
            printf("There are no solutions for %d.\n", n);
    }
    return 0;
}

bool check(int x , int l1,int y ,int l2)
{
    bool re[10];
    memset(re,0,sizeof(re));
    if(l1==4&&l2==4)    return 0;
    if(l1==4 || l2==4)    re[0]=1;
    while(x)
    {
        if(re[x%10])   return 0;
        re[x%10] = 1;
        x/=10;
    }
    if(y != -1)
    while(y)
    {
        if(re[y%10])   return 0;
        re[y%10] = 1;
        y/=10;
    }
    return 1;
}

posted on 2017-07-20 16:30  yjbjingcha  阅读(105)  评论(0编辑  收藏  举报

导航