链接:河南萌新联赛2025第(三)场:河南理工大学_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ
预估难度:
简单:B E G H K
中等:A F
B. 上海保卫战

示例一:
输入:
5
输出:
2
说明:
第一轮 n = 5 的最小质除数是5,返回 0 到达第二轮第一步。
第二轮 n = 0,满足结束条件,退出函数。
因此输出 2 。
示例二:
输入:
4
输出:
3
备注:
函数哪怕只运行一步也算运行了一轮
思路分析:
这段代码的核心目标是计算将一个整数 n通过特定操作逐步减到 0所需的最少操作次数。操作规则是:每次减去当前数的最小素因子(如果是偶数则固定减2),直到 n归零。仅仅这样的话,运行会超时,需要优化一下,就是当n减到偶数时直接加上此时的n/2就可以了,没必要再调用函数了,函数里面for就可以值遍历奇数就可以了。
实现代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pii pair<int,int>
#define fi first
#define se second
const int N=101;
// 函数:suuu(x) - 返回x的最小素因子
int suuu(int x)
{
if(x==0) return 0;
if(x%2==0) return 2; // 如果x是偶数,最小素因子是2
// 检查奇数因子,从3开始,步长为2(跳过偶数)
for(int i=3; i<=x/i; i+=2)
{
if(x%i==0)
return i; // 返回i作为最小素因子
}
return x; // 如果x是素数,返回x本身
}
void slove(){
int n, ans=1;
cin>>n;
while(n)
{
n -= suuu(n); // 减去n的最小素因子
ans++; // 操作次数加1
// 如果剩余n是偶数,直接处理所有2的因子
if(n%2==0)
{
ans += n/2;
break;
}
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int _=1;
//cin>>_;
while(_--)
slove();
return 0;
}
E. 星际争霸
题目描述:
在星际争霸2游戏中,神族有一种单位叫做追猎者,人族有一种建筑叫做行星要塞,有一种通用资源叫做晶体矿,每个行星要塞内都保存着一定量的晶体矿。
现在你有 ss 只追猎者,每只都有一定的攻击力 aa 。人族有 bb 个行星要塞,每个行星要塞都有一定的防御能力 dd 和一定量的晶体矿 gg 。
追猎者可以攻击所有防御力小于等于其攻击力的行星要塞,与此同时,该建筑的所有晶体矿都会被抢走。
请你求出每只追猎者能抢到的最大晶体矿总数。
注意:这是一个模拟的场景,并没有真正攻击行星要塞,也就是说追猎者之间不会相互影响结果。
注意输出要求答案放在一行中!
示例一:
输入:
5 4
1 3 5 2 4
0 1
4 2
2 8
9 4
输出:
1 9 11 9 11
说明:
第一只追猎者只能攻击第一个行星要塞。
第二只追猎者可以攻击第一个和第三个行星要塞。 &nbs

最低0.47元/天 解锁文章
1259

被折叠的 条评论
为什么被折叠?



