2 条题解

  • 0
    @ 2024-11-24 16:02:56

    • 0
      @ 2024-11-7 20:42:47

      这道题看起来是用搜索算法,实则是一个数论大题。

      首先根据题意,我们可以先写一个暴力搜索代码(DFS):

      #include<bits/stdc++.h>
      using namespace std;
      typedef long long ll;
      const ll inf=2e9,f[10]={6,2,5,5,4,5,6,3,7,6};
      ll i,ans;
      void dfs(ll gz,ll x){
      	if(gz>i)return;
      	if(gz==i)return ans=min(ans,x),void();
      	for(ll i=0;i<=9;i++){
      		if(i==0&&gz==0)continue;
      		dfs(gz+f[i],x*10+i);
      	}
      }
      int main(){
      	for(i=1;i<=40;i++){
      		ans=inf;
      		dfs(0,0);
      		cout<<i<<"的答案是"<<ans<<'\n';
      	}
      }
      

      然后我们可以得出 1≤n≤40 时的答案如下。(搜到 40就炸了)

      于是我们可以发现DFS的代码只可以得到30分。 但是观察发现好像又有规律。 N mod 7,可以得到答案的开头,然后剩下就是8,有多少个8。 最后我们再处理一些特例,(比如:1,10等等)

      #include<bits/stdc++.h>
      using namespace std;
      const int f[10]={0,-1,1,7,4,2,6,8,10};
      int T,n,d,i;
      int main(){
      	for(cin>>T;T--;){
      		cin>>n;
      		if(n<=8)cout<<f[n];
      		else{
      			d=n%7;
      			if(!d)for(i=1;i<=n/7;i++)cout<<8;
      			if(d==1){
      				cout<<10;
      				for(i=1;i<n/7;i++)cout<<8;
      			}
      			if(d==2){
      				cout<<1;
      				for(i=1;i<=n/7;i++)cout<<8;
      			}
      			if(d==3){
      				if(n==10)cout<<22;
      				else{
      					cout<<200;
      					for(i=1;i<=n/7-2;i++)cout<<8;
      				}
      			}
      			if(d==4){
      				cout<<20;
      				for(i=1;i<n/7;i++)cout<<8;
      			}
      			if(d==5){
      				cout<<2;
      				for(i=1;i<=n/7;i++)cout<<8;
      			}
      			if(d==6){
      				cout<<6;
      				for(i=1;i<=n/7;i++)cout<<8;
      			}
      		}
      		cout<<'\n';
      	}
      }
      
      • 1

      信息

      ID
      1063
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      2
      已通过
      2
      上传者