社区讨论
B4050为什么这题的贪心是先物理后魔法,就10pts
B4050[GESP202409 五级] 挑战怪物参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miag9aca
- 此快照首次捕获于
- 2025/11/22 23:34 4 个月前
- 此快照最后确认于
- 2025/11/23 12:41 4 个月前
读了很多题解,核心多是先物理而后魔法,不知为何。
遂网络查找,未得究竟,后咨询 deepseek ,答的驴唇不对马嘴。
遂来此相询。需贪心证明。有能证者,必当鸣谢及互关。
#include<bits/stdc++.h>
using namespace std;
int p[9700],ct=2,s=0,h;
void init()//质数筛,应该没问题
{
p[1]=2;
for(int i=3;i<=100001;i++)
{
bool f=0;
for(int j=2;j*j<=i;j++)
{
if(i%j==0)
{
f=1;break;
}
}
if(!f) p[ct++]=i;
}
}
void solve()
{
for(int i=1;;i++)//先魔法
{
if(p[i]==h){cout<<1<<'\n';return;}
else if(p[i]<h&&p[i+1]>h){h-=p[i];s++;break;}
}
for(int i=1;;i++)//后幂减
{
h-=1<<(i-1);
if(h>0)s++;
else if(h==0){cout<<s<<'\n';return;}
else {cout<<-1<<'\n';return;}
}
}
int main()
{
int _;
cin>>_;
init();
while(_--)
{
cin>>h;
if(h==1||h==2||h==3||h==5||h==7)cout<<1<<'\n';
else if(h==4||h==6)cout<<2<<'\n';
//怕出问题的特判
else solve();
}
}
代码样例输出如下:
CPP2
3
-1
回复
共 3 条回复,欢迎继续交流。
正在加载回复...