打卡信奥刷题(1379)用C++实现信奥 B4050 [GESP202409 五级] 挑战怪物

B4050 [GESP202409 五级] 挑战怪物

题目描述

小杨正在和一个怪物战斗,怪物的血量为 hhh,只有当怪物的血量恰好000 时小杨才能够成功击败怪物。

小杨有两种攻击怪物的方式:

  • 物理攻击。假设当前为小杨第 iii 次使用物理攻击,则会对怪物造成 2i−12^{i - 1}2i1 点伤害。
  • 魔法攻击。小杨选择任意一个质数 xxx( 不能超过怪物当前血量),对怪物造成 xxx 点伤害。由于小杨并不擅长魔法,他只能使用至多一次魔法攻击。

小杨想知道自己能否击败怪物,如果能,小杨想知道自己最少需要多少次攻击。

输入格式

本题单个测试点内有多组测试数据。第一行包含一个正整数 ttt,代表测试用例组数。

接下来是 ttt 组测试用例。对于每组测试用例,只有一行一个整数 hhh,代表怪物血量。

输出格式

对于每组测试用例,如果小杨能够击败怪物,输出一个整数,代表小杨需要的最少攻击次数,如果不能击败怪物,
输出 −1-11

输入输出样例 #1

输入 #1

3
6
188
9999

输出 #1

2
4
-1

说明/提示

样例 1 解释

对于第一组测试用例,一种可能的最优方案为,小杨先对怪物使用魔法攻击,选择质数 555 造成 555 点伤害,之后对怪
物使用第 111 次物理攻击,造成 21−1=12^{1 - 1} = 1211=1 点伤害,怪物血量恰好为 000,小杨成功击败怪物。

数据规模与约定

子任务编号分数占比ttthhh
11120%20\%20%≤5\leq 55≤10\leq 1010
22220%20\%20%≤10\leq 1010≤100\leq 100100
33360%60\%60%≤10\leq 1010≤105\leq 10^5105

对于全部的测试数据,保证 1≤t≤101 \leq t \leq 101t101≤h≤1051 \leq h \leq 10^51h105

C++实现

#include <bits/stdc++.h>
using namespace std;
inline bool is_prime(int n){
    if(n < 2) return false;
    for(int i = 2; i*i <= n; i++) if(n % i == 0) return false;
    return true;
}
int t, n;
bool flag;
int main(){
    scanf("%d", &t);
    while(t--){
        flag = false;
        scanf("%d", &n);
        for(int i = 0, now = 0; now <= n; ++i, now = now<<1 | 1){
            if(n - now == 0){
                printf("%d\n", i);
                goto next;
            }
            else if(is_prime(n-now)){
                printf("%d\n", i+1);
                goto next;
            }
        }
        puts("-1");
        next:;
    }
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值