HeRaNO's NOIP CSP Round Day 2 T1 building
考试的时候居然睡着了。。。
T1的60分做法很明显,3^n枚举每个状态并进行验证
(考试剩十分钟结束的时候我开始打,,不到五分钟就写完了?
暴力(60分)
#include<bits/stdc++.h> #define int long long #define re register #define ll long long #define inc(i,j,k) for(re int i=j;i<=k;++i) #define dec(i,j,k) for(re int i=j;i>=k;--i) using namespace std; const int maxn=30; int n,bit[maxn],anss; ll x; inline ll lowbit(ll t) {return (t&(-t));} inline int count(ll w) { int tt=0; while(w) { w-=lowbit(w); tt++; } return tt; } int p[maxn][4]; inline void dfs(int dep,ll sum) { if(sum>x) return; if(dep==n) { if(sum==x) anss++; return; } dfs(dep+1,sum+p[dep+1][1]); dfs(dep+1,sum+p[dep+1][2]); dfs(dep+1,sum+p[dep+1][3]); } signed main() { // freopen("123123.in","r",stdin); scanf("%lld%lld",&n,&x); bit[0]=0; bit[1]=2; inc(i,2,27) bit[i]=bit[i-1]<<1; inc(i,1,n) { scanf("%lld",&p[i][1]); p[i][2]=bit[count(p[i][1])]; p[i][3]=0; } dfs(0,0); cout<<anss<<endl; }
然后说一下正解吧。
既然搜索能够拿到这么高的分数,观察到100%的数据与暴搜数据范围差距不大
考虑对搜索进行优化 (显然 meet-in-the-middle) (俺英语差 别D我)
emm就没了,从状态一暴搜一半 ,从状态n暴搜一半,这样可以大大减小搜索树的大小(减小最少一半吧)
这道题毒瘤出题人竟然放了个n=1的点
真是苟啊..
ACcode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #include<bits/stdc++.h> #define int long long #define re register #define ll long long #define inc(i,j,k) for(re int i=j;i<=k;++i) #define dec(i,j,k) for(re int i=j;i>=k;--i) using namespace std; const int maxn=30; int n,bit[maxn],anss; ll x; inline ll lowbit(ll t) { return (t&(-t));} inline int count(ll w) { int tt=0; while (w) { w-=lowbit(w); tt++; } return tt; } int p[maxn][4],pp[maxn][4]; map< int , int > cnt1,cnt2; map< int , int >::iterator it; inline void dfs1( int dep,ll sum) { if (dep==n/2+1) { cnt1[sum]++; return ; } dfs1(dep+1,sum+p[dep][1]); dfs1(dep+1,sum+p[dep][2]); dfs1(dep+1,sum+p[dep][3]); } inline void dfs2( int dep,ll sum) { if (dep==(n-n/2+1)) { cnt2[sum]++; return ; } dfs2(dep+1,sum+pp[dep][1]); dfs2(dep+1,sum+pp[dep][2]); dfs2(dep+1,sum+pp[dep][3]); } inline void dfs( int dep,ll sum) { if (sum>x) return ; if (dep==n) { if (sum==x) anss++; return ; } dfs(dep+1,sum+p[dep+1][1]); dfs(dep+1,sum+p[dep+1][2]); dfs(dep+1,sum+p[dep+1][3]); } signed main() { // freopen("123123.in","r",stdin); scanf( "%lld%lld" ,&n,&x); if (n==1) { bit[0]=0; bit[1]=2; inc(i,2,27) bit[i]=bit[i-1]<<1; inc(i,1,n) { scanf( "%lld" ,&p[i][1]); p[i][2]=bit[count(p[i][1])]; p[i][3]=0; } dfs(0,0); cout<<anss<<endl; return 0; } bit[0]=0; bit[1]=2; inc(i,2,27) bit[i]=bit[i-1]<<1; inc(i,1,n/2) { scanf( "%lld" ,&p[i][1]); p[i][2]=bit[count(p[i][1])]; p[i][3]=0; } inc(i,1,n-n/2) { scanf( "%lld" ,&pp[i][1]); pp[i][2]=bit[count(pp[i][1])]; pp[i][3]=0; } dfs1(1,0); dfs2(1,0); anss=0; for (it=cnt2.begin();it!=cnt2.end();it++) { ll aa=it->first,bb=it->second; anss+=bb*cnt1[x-aa]; } cout<<anss; } |
(( /|_/|
\\.._.' , ,\
/\ | '.__ v /
(_ . / "
) _)._ _ /
'.\ \|( / (
'' ''\\ \\
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了