社区讨论

B4050为什么这题的贪心是先物理后魔法,就10pts

B4050[GESP202409 五级] 挑战怪物参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@miag9aca
此快照首次捕获于
2025/11/22 23:34
4 个月前
此快照最后确认于
2025/11/23 12:41
4 个月前
查看原帖
我的弱项是贪心,勿喷
读了很多题解,核心多是先物理而后魔法,不知为何。
遂网络查找,未得究竟,后咨询 deepseek ,答的驴唇不对马嘴。
遂来此相询。需贪心证明。有能证者,必当鸣谢及互关。
CPP
#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();
    }
}
代码样例输出如下:
CPP
2
3
-1

回复

3 条回复,欢迎继续交流。

正在加载回复...