H - Heir's Dilemma(打表或者暴力)

mac2025-09-13  6

题目: 思路:参考队友的代码,学了打表;一直以为是自己的方法太暴力,反思超时也不能一组数据也过不了。 后来让别人检查错误原因是,6位数组开小了,数组下标是从0开始的,0,1,2,3,4,5,6,至少得开7位的数组啊 AC代码 队友的打表法

#include <bits/stdc++.h> using namespace std; int x; int a[6]; bool vis[10000000],vv[10]; int i,b; void dabiao() { for(i=123455;i<=987655;i++) { memset(vv,0,sizeof(vv)); int flag=1; int x=i; while(x>0) { b=x%10; x=x/10; if(b==0||i%b!=0||vv[b])//新学到的标记是否出现 { flag=0; break; } vv[b]=1; } if(flag==0) continue; else if(flag==1) vis[i]=1; } } int main() { ios::sync_with_stdio(0); int l,h; cin>>l>>h; memset(vis,0,sizeof(vis)); dabiao();//打表把所有结果列出来 int sum=0; for(int i=l; i<=h; i++) { if(vis[i])sum++;//需要判断某一值时直接利用打表的结果 } cout<<sum<<endl; return 0; }

参考别人的代码

#include <bits/stdc++.h> using namespace std; int x; int f(int x) { int vis[20]= {0}; int now=x; while(now) { if(now%10==0) { return 0; break; } if(vis[now%10]) { return 0; break; } if(x%(now%10)!=0) { return 0; break; } vis[now%10]=1; now /=10; } return 1; } int main() { ios::sync_with_stdio(0); int l,h; cin>>l>>h; int sum=0; for(int i=l; i<=h; i++) { if(f(i))sum++; } cout<<sum<<endl; return 0; }

自己的AC代码 太不容易了

#include <bits/stdc++.h> using namespace std; int x; int a[10]; int f(int x) { int t=x; int j; int flag=1; for(j=1; j<=6; j++) { a[j]=x%10; x=x/10; if(a[j]==0) { flag=0; break; } else if(t%a[j]!=0) { flag=0; break; } } for(int m=1;m<=6;m++) { for(int n=m+1;n<=6;n++) { if(a[m]==a[n]){ flag=0;break;} } } if(flag==1) return 1; else return 0; } int main() { ios::sync_with_stdio(0); int l,b; cin>>l>>b; int sum=0; for(int i=l; i<=b; i++) { if(f(i)==1)sum++; } cout<<sum<<endl; return 0; }
最新回复(0)