怎么才能过时限 三连击

P1618 三连击(升级版)

不能直接枚举O(n^3)必T无疑 你枚举一个数后另外两个数就已经确定了,然后判断,总枚举状态数O(n) ```cpp #include<bits/stdc++.h> using namespace std; int a,b,c,A,B,C,used[10];bool flag; int main() { cin>>A>>B>>C; for(int i=1;i<=9;i++) { for(int j=1;j<=9;j++) { for(int k=1;k<=9;k++) { memset(used,0,sizeof(used)); a=i*100+j*10+k; if(B*a%A!=0)continue;else b=B*a/A; if(C*a%A!=0)continue;else c=C*a/A; if(c>=1000)continue; used[i]=1; if(used[j]==1||j==0)continue;else used[j]=1; if(used[k]==1||k==0)continue;else used[k]=1; if(used[b%100/10]==1||(b%100/10)==0)continue;else used[b%100/10]=1; if(used[c%100/10]==1||(c%100/10)==0)continue;else used[c%100/10]=1; if(used[b/100]==1||(b/100)==0)continue;else used[b/100]=1; if(used[c/100]==1||(b/100)==0)continue;else used[c/100]=1; if(used[b%10]==1||(b%10)==0)continue;else used[b%10]=1; if(used[c%10]==1||(b%10)==0)continue;else used[c%10]=1; cout<<a<<" "<<b<<" "<<c<<endl;flag=1; } } } if(!flag)cout<<"No!!!"; return 0; } ```
by huangsy @ 2019-02-02 18:07:30


因为此题正解是dfs+剪枝
by 万弘 @ 2019-02-02 18:38:38


```cpp for(int i=123;i<=987;i++) { j=i*b/a;k=i*c/a; if(f(i,j,k)==1&&j<=987&&k<=987) { printf("%d %d %d\n",i,j,k); count++; } } ``` 这样子ac了
by sunzhen @ 2019-02-02 18:43:25


for(int i=123;i<=987;i++) { int ans=0; int num[11]={0,1,2,3,4,5,6,7,8,9}; for(int j=1;j<=9;j++) { if(i/100==num[j]||(i/10)%10==num[j]||i%10==num[j]) { ans++; num[j]=0; } } if(ans!=3) continue; else { k=i*b/a; if(k>999) continue; for(int j=1;j<=9;j++) { if(num[j]==0) continue; if(k/100==num[j]||(k/10)%10==num[j]||k%10==num[j]) { ans++; num[j]=0; } } if(ans!=6) continue; else { l=i*c/a; if(l>999) continue; for(int j=1;j<=9;j++) { if(num[j]==0) continue; if(l/100==num[j]||(l/10)%10==num[j]||l%10==num[j]) { ans++; num[j]=0; } } if(ans!=9) continue; else { cout<<i<<" "<<k<<" "<<l<<endl; flag++; } } } } if(flag==0) cout<<"No!!!"; 暴力解法
by zhensama @ 2019-02-02 19:49:36


~~暴力判断~~
by whatismyname0 @ 2019-02-14 11:15:21


|