我用的枚举法,即每产生一组数据就判断是否是所给数字里的.
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.