#3977. [GESP2409 五级] 挑战怪物

[GESP2409 五级] 挑战怪物

挑战怪物

题目描述

⼩杨正在和⼀个怪物战⽃,怪物的⾎量为 ,只有当怪物的⾎量恰好为 时⼩杨才能够成功击败怪物。 ⼩杨有两种攻击怪物的⽅式: 物理攻击。假设当前为⼩杨第 次使⽤物理攻击,则会对怪物造成 点伤害。 魔法攻击。⼩杨选择任意⼀个质数 ( 不能超过怪物当前⾎量),对怪物造成 点伤害。由于⼩杨并不擅长魔 法,他只能使⽤⾄多⼀次魔法攻击。 ⼩杨想知道⾃⼰能否击败怪物,如果能,⼩杨想知道⾃⼰最少需要多少次攻击。

输入格式

第⼀⾏包含⼀个正整数 ,代表测试⽤例组数。 接下来是 组测试⽤例。对于每组测试⽤例,第⼀⾏包含⼀个正整数 ,代表怪物⾎量。

输出格式

对于每组测试⽤例,如果⼩杨能够击败怪物,输出⼀个整数,代表⼩杨需要的最少攻击次数,如果不能击败怪物, 输出 。 3.2.4 样例1 1 3 2 6 3 188 4 9999 1 2 2 4 3 -1 对于第⼀组测试⽤例,⼀种可能的最优⽅案为,⼩杨先对怪物使⽤魔法攻击,选择质数 造成 点伤害,之后对怪 物使⽤第 次物理攻击,造成 点伤害,怪物⾎量恰好为 ,⼩杨成功击败怪物。 子任务编号 数据点占比 1 20% 2 20% 3 60% 对于全部数据,保证有 。 3.2.5 参考程序 1 #include <bits/stdc++.h> 2 using namespace std; 3 vector prime; 4 bool is_prime[100010]; 5 void Eratosthenes(int n) { 6 is_prime[0] = is_prime[1] = false; 7 for (int i = 2; i <= n; ++i) is_prime[i] = true; 8 for (int i = 2; i <= n; ++i) { 9 if (is_prime[i]) { 10 prime.push_back(i); 11 if ((long long)i * i > n) continue; 12 for (int j = i * i; j <= n; j += i) 13 is_prime[j] = false; 14 } 15 } 16 } 17 int main() { 18 Eratosthenes(100000); 19 int t; 20 cin>>t; 21 while(t--){ 22 int tmp=1; 23 int x; 24 cin>>x; 25 int ans=0; 26 while(1){ 27 if(is_prime[x]){ 28 ans++; 29 break; 30 } 31 x-=tmp; 32 ans++; 33 if(x<=0){ 34 if(x<0)ans=-1; 35 break; 36 } 37 tmp*=2; 38 } 39 cout<<ans<<"\n"; 40 } 41 }

样例输入 #1

1 3
2 6
3 188
4 9999
1 2
2 4
3 -1
对于第⼀组测试⽤例,⼀种可能的最优⽅案为,⼩杨先对怪物使⽤魔法攻击,选择质数 造成 点伤害,之后对怪
物使⽤第 次物理攻击,造成 点伤害,怪物⾎量恰好为 ,⼩杨成功击败怪物。
子任务编号 数据点占比
1 20%
2 20%
3 60%

样例输出 #1


数据范围

见题目描述

知识点与难度

本题涉及的知识点从属于 GESP 5级,难度等级:⭐⭐⭐⭐ 。


测试点分布

Subtask 分值 测试点编号 说明
0 10 1~2 样例
1 20 3~8 小规模 / 特殊性质
2 15 9~11 Hack
3 30 12~20 中大规模
4 25 21~25 随机回归

生测试数据后,按实际 subtask 分组改写上表。