zoukankan      html  css  js  c++  java
  • USACO 1.3.3 Prime Cryptarithm

    题目链接:1.3.3

    我用的枚举法,即每产生一组数据就判断是否是所给数字里的.

    AC还沾沾自喜,但一看题解,发现自己的代码真low...

    在平时练习时,应该追求高效,精炼的代码,这样比赛时才能省出大量时间去做其他题!

    /*
    ID:wang9621
    PROG:crypt1
    LANG:C++
    */
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int cnt[11];
    int main()
    {
        freopen("crypt1.in","r",stdin);
        freopen("crypt1.out","w",stdout);
        int n;
        scanf("%d",&n);
        for(int i = 1;i<=n; i++) scanf("%d",&cnt[i]);
        int count = 0;
        int flag = 0;
        int flag1 = 0;
        int flag2 = 0;
        int cnt1,cnt2;
        for(int i = 1; i<=n; i++)
        {
            if(cnt[i]==0&&i==1) continue;
            for(int j = 1; j<=n; j++)
            {
                for(int k = 1; k<=n; k++)
                {
                    flag = cnt[i]*100+cnt[j]*10+cnt[k];
                    for(int p = 1; p<=n; p++)
                    {
                        if(cnt[p]==0&&p==1) continue;
                        for(int q = 1; q<=n; q++)
                        {
                            cnt1 = flag1 = flag*cnt[p];
                            cnt2 = flag2 = flag*cnt[q];
                            int flag11 = 0;
                            int wei1 = 0;
                            int flag22 = 0;
                            int wei2 = 0;
                            while(flag1)
                            {
                                int sou = flag1%10;
                                for(int s = 1; s<=n; s++)
                                {
                                    if(cnt[s] == sou)
                                    {
                                        flag11++;
                                        break;
                                    }
                                }
                                wei1++;
                                flag1 /= 10;
                            }
                            while(flag2)
                            {
                                int sou = flag2%10;
                                for(int s = 1; s<=n; s++)
                                {
                                    if(cnt[s] == sou)
                                    {
                                        flag22++;
                                        break;
                                    }
                                }
                                wei2++;
                                flag2 /= 10;
                            }
                            if(flag11==3&&flag22==3&&wei1==3&&wei2==3)
                            {
                                int sum = cnt1+cnt2*10;
                                int cntt = 0;
                                int cnttt = 0;
                                while(sum)
                                {
                                    int sou = sum%10;
                                    for(int s = 1; s<=n; s++)
                                    {
                                        if(cnt[s] == sou)
                                        {
                                            cntt++;
                                            break;
                                        }
                                    }
                                    cnttt++;
                                    sum /= 10;
                                }
                                if(cntt==4&&cnttt==4)
                                {
                                    count++;
                                }
                            }
                        }
                    }
                }
            }
        }
        printf("%d
    ",count);
        return 0;
    }
    我的代码

    测试结果

    Executing...
       Test 1: TEST OK [0.000 secs, 4184 KB]
       Test 2: TEST OK [0.000 secs, 4184 KB]
       Test 3: TEST OK [0.000 secs, 4184 KB]
       Test 4: TEST OK [0.000 secs, 4184 KB]
       Test 5: TEST OK [0.011 secs, 4184 KB]
       Test 6: TEST OK [0.000 secs, 4184 KB]
       Test 7: TEST OK [0.011 secs, 4184 KB]
    
    All tests OK.

    /*
    ID:wang9621
    PROG:crypt1
    LANG:C++
    */
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int cnt[11];
    bool hash1(int x)
    {
        while(x)
        {
            if(!cnt[x%10]) return false;
            x /= 10;
        }
        return true;
    }
    int main()
    {
        freopen("crypt1.in","r",stdin);
        freopen("crypt1.out","w",stdout);
        int n,x;
        int count = 0;
        scanf("%d",&n);
        for(int i = 1;i<=n; i++)
        {
            scanf("%d",&x);
            cnt[x] = 1;
        }
        for(int i = 100; i<1000; i++)
        {
            if(hash1(i))
            {
                for(int j = 10; j<100; j++)
                {
                    if(hash1(j))
                    {
                        if(i*j<10000&&i*(j/10)<1000&&i*(j%10)<1000&&hash1(i*(j%10))&&hash1(i*(j/10))&&hash1(i*j))
                        {
                            count++;
                        }
                    }
                }
            }
        }
        printf("%d
    ",count);
        return 0;
    }
    高效代码
    测试结果

    Executing... Test 1: TEST OK [0.000 secs, 4180 KB] Test 2: TEST OK [0.000 secs, 4180 KB] Test 3: TEST OK [0.000 secs, 4180 KB] Test 4: TEST OK [0.000 secs, 4180 KB] Test 5: TEST OK [0.000 secs, 4180 KB] Test 6: TEST OK [0.000 secs, 4180 KB] Test 7: TEST OK [0.000 secs, 4180 KB]
    All tests OK.
  • 相关阅读:
    多级部署下的SuperMap iServer 2.0 JS 聚合功能(一)
    Kubernetes&Docker集群部署
    股票数据存储系统(KeyValue存储)设计与实现
    Ajax+Tornado模拟长、短轮询
    REST架构网站改写:前端MVC Angular.js,Web框架 Express.js, 数据库 MongoDB
    SQLite数据库C++ API封装
    一致性哈希(Consistent Hashing)算法的C++实现
    数据结构——排序
    数据结构——折半查找
    索引学习笔记
  • 原文地址:https://www.cnblogs.com/littlepear/p/5678557.html
Copyright © 2011-2022 走看看