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.
原文地址:https://www.cnblogs.com/littlepear/p/5678557.html