2024初三年前集训测试3
2024初三年前集训测试3
夕景昨日
-
部分分
:输出No
。 : 的 暴力枚举能得到的所有数,用map
里进行判断。 :输出Yes
。
-
正解
- 观察到
。 - 猜测
到达一定数量级时,一定有解。 个数最多产生 个数, 最多配对出 个数。经打表,枚举 解关于 的不等式 ,解得当 时, 的最小整数解为 。- 严格意义上来说,极限数据应该造成
。
- 严格意义上来说,极限数据应该造成
- 故当
时,仍选择用 暴力枚举;否则,一定有解。
点击查看代码
ll a[100001],flag=0; map<ll,ll>vis; void dfs(ll x,ll now,ll n) { if(x==n) { vis[now]++; if(vis[now]==2) { flag=1; } } else { dfs(x+1,now+a[x+1],n); dfs(x+1,now-a[x+1],n); } } int main() { ll n,i; cin>>n; for(i=1;i<=n;i++) { cin>>a[i]; } if(n<=25) { dfs(0,0,n); if(flag==0) { cout<<"No"<<endl; } else { cout<<"Yes"<<endl; } } else { cout<<"Yes"<<endl; } return 0; }
- 观察到
透明答案
- 部分分
:输出Bob
。 :输出Ayano
。
- 正解
- 博弈论
-
弱化
- 删去“此外,每
回合他们会添加一堆石子(含 块石子)。换句话说,在第 次操作(两个人操作的总次数)之后,如果可以被 整除,则添加一堆 块石子的石子堆。(即使在第 次操作中取完了所有石子,如果 可被 整除,也会添加新石子堆并继续游戏。)”,其他部分不变。 - 由
博弈,有Ayano
获胜当且仅当 时,即 ;否则,有Bob
获胜。
- 删去“此外,每
-
手动模拟
- 当
时,有Ayano
获胜。 - 当
时,有Bob
获胜。 - 当
时,有Ayano
获胜。
- 当
-
推广
- 将
拆成 。前面 堆答案不造成影响,对答案造成影响的只有 。故当 时,有Bob
获胜。 否则,有Ayano
获胜。
点击查看代码
int main() { int n; cin>>n; if(n%3==2) { cout<<"Bob"<<endl; } else { cout<<"Ayano"<<endl; } return 0; }
- 将
-
- 出题人称因是普及难度的比赛,所以把
放过去了。
- 出题人称因是普及难度的比赛,所以把
- 博弈论
界外科学
-
部分分
-
:超大背包 枚举。点击查看代码
ll a[50],b[50],ans=0; void dfs(ll x,ll worth,ll now,ll n,ll m) { if(x==n) { ans=(worth<=m)?max(ans,now):ans; } else { dfs(x+1,worth^a[x+1],now+b[x+1],n,m); dfs(x+1,worth,now,n,m); } } int main() { ll n,m,i; cin>>n>>m; for(i=1;i<=n;i++) { cin>>a[i]; } for(i=1;i<=n;i++) { cin>>b[i]; } dfs(0,0,0,n,m); cout<<ans<<endl; return 0; }
-
-
输出
。 -
超大背包
的玄学优化,优化后时间复杂度未知。点击查看代码
ll a[50],b[50],sum[50],ans=0; void dfs(ll x,ll worth,ll now,ll n,ll m) { if(x==n) { ans=(worth<=m)?max(ans,now):ans; } else { if(now+sum[n]-sum[x]>ans) { dfs(x+1,worth^a[x+1],now+b[x+1],n,m); } if(now+sum[n]-sum[x+1]>ans) { dfs(x+1,worth,now,n,m); } } } int main() { ll n,m,i; cin>>n>>m; for(i=1;i<=n;i++) { cin>>a[i]; } for(i=1;i<=n;i++) { cin>>b[i]; sum[i]=sum[i-1]+(b[i]>0)*b[i]; } dfs(0,0,0,n,m); cout<<ans<<endl; return 0; }
-
面向数据点分治,当
较大时,选择 的 背包做法。- 这里背包不能滚成一维。
-
-
-
正解
点击查看官方题解
回忆补时
-
部分分
-
: 暴力枚举。点击查看代码
ll k[100001],b[100001]; int main() { ll n,q,x,ans,i,j,h; scanf("%lld",&n); for(i=1;i<=n;i++) { scanf("%lld%lld",&k[i],&b[i]); } scanf("%lld",&q); for(i=1;i<=q;i++) { scanf("%lld",&x); ans=0; for(j=1;j<=n;j++) { for(h=j+1;h<=n;h++) { ans=max(ans,max(k[h]*(k[j]*x+b[j])+b[h],k[j]*(k[h]*x+b[h])+b[j])); } } printf("%lld\n",ans); } return 0; }
-
:当 时, 越大对答案的贡献越大;当 时, 越小对答案的贡献越小。考虑计算出 的最大值、次大值、最小值、次小值,然后进行转移。点击查看代码
ll k[100001],b[100001]; int main() { ll n,q,x,ans,zmax,cmax,zmin,cmin,idzmax,idzmin,i,j; cin>>n; for(i=1;i<=n;i++) { cin>>k[i]>>b[i]; } cin>>q; for(i=1;i<=q;i++) { cin>>x; ans=zmax=cmax=idzmax=idzmin=0; zmin=cmin=0x7f7f7f7f; for(j=1;j<=n;j++) { if(k[j]*x+b[j]>zmax) { cmax=zmax; zmax=k[j]*x+b[j]; idzmax=j; } else { cmax=max(cmax,k[j]*x+b[j]); } if(k[j]*x+b[j]<zmin) { cmin=zmin; zmin=k[j]*x+b[j]; idzmin=j; } else { cmin=min(cmin,k[j]*x+b[j]); } } for(j=1;j<=n;j++) { if(k[j]>=0) { ans=max(ans,(j==idzmax)?cmax*k[j]+b[j]:zmax*k[j]+b[j]); } else { ans=max(ans,(j==idzmin)?cmin*k[j]+b[j]:zmin*k[j]+b[j]); } } cout<<ans<<endl; } return 0; }
-
-
正解
点击查看官方题解
总结
- 打到
就去打矩阵快速幂了。 - 要学会通过值域猜测时间复杂度和判断答案范围。
后记
- 普及模拟赛考博弈论、折半搜索、李超线段树,难评。
- 没有大样例,差评。
- 建议本场比赛改名为暴力骗分/良心送分模拟赛。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18008439,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具