什么?这题是枚举吗?
2026-10-26 21:52:19
发布于:吉林
1阅读
0回复
0点赞
搞半天我一直以为是搜索题呀……
简单讲一下我的思路。
看到此题,注意到题面,注意到数据范围,一秒想到搜索。
搜索还不简单。
首先,朴素的搜索,就是需要一个step(当前到哪一个数),一个now(还剩多少木棒),一个ok(现在可不可以放0,及是不是开头位),然后,一个一个数枚举,判断now是否大于等于这个数需要的木棍数,可以就搜一下,然后记得回溯,这应该很好想,对吧?
注意要记得:
- n记得减4,别把+和=忘了;
- 如果ok=false(即是开头位),记得判断可不可以只放一个0;
当然,这道题的话,我觉得可能还是需要一个小小的截剪枝的,所以,我就只加了——step=3直接不在递归直接算加和然后判断当前的now是否正好就可以了。
这个速度足够过这个数据范围。
话不多说,贴一下我写了60多行的搜索……
#include<bits/stdc++.h>
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#define please return
#define AC 0;
using namespace std;
int n,ans=0;
int a[11]={6,2,5,5,4,5,6,3,7,6};
int no,nt,na;
int k;
void dfs(int st,int now,bool ok){
if(st==3){
na=no+nt;
k=0;
if(na==0) k+=6;
while(na){
k+=a[na%10];
na/=10;
}
if(k==now) ans++;
return;
}
if(now<=0) return;
for(int i=0;i<10;i++){
if(i==0&&!ok) continue;
if(now>=a[i]){
if(st==1){
no=no*10+i;
dfs(st+1,now-a[i],false);
dfs(st,now-a[i],true);
no=no/10;
}else{
nt=nt*10+i;
dfs(st+1,now-a[i],false);
dfs(st,now-a[i],true);
nt=nt/10;
}
}
}
if(!ok&&now>=6){
if(st==1){
no=0;
dfs(st+1,now-6,false);
}else{
nt=0;
dfs(st+1,now-6,false);
}
}
}
int main(){
// freopen("data.in","r",stdin);
// freopen("user.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
n-=4;
if(n<=0) cout<<0;
else{
dfs(1,n,false);
cout<<ans;
}
please AC
}
hyw
这里空空如也







有帮助,赞一个