码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-17 19:38:06      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:acm   uva   算法竞赛入门经典   


///////////////////////////////////////////////////////////////////////////////////////////////////////
作者: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;
}

版权声明:本文为博主原创文章,允许非商业性转载,转载必须注名作者(CSDN tt2767)与本博客链接:http://blog.csdn.net/tt2767。

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

标签:acm   uva   算法竞赛入门经典   

原文地址:http://blog.csdn.net/tt2767/article/details/47728447

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!