普及冲奖——贪心补题报告
T1.小可分身术
一.题目要求
小可学会了分身术,一开始有一只小可,接下来会进行k轮操作,每一轮中每一只小可都会变成p只小可。 要求k轮后小可的总数恰好为n。要求找到两个正整数p,k,使得p+k最大
输入描述
输入一个整数n。
输出描述
输出p+k的最大值。
输入样例
2
输出样例
3
数据描述
2≤𝑛≤1e18
二.解题思路
-
问题转化:
满足
p^k = n的条件下最大化p + k。数学分析表明:-
当
p增大时,k会减小(因n固定),但p的增长对p + k的贡献远大于k的减少。 -
最优解出现在
p取最大值时,即p = n,此时k = 1(因n^1 = n),此时p + k = n + 1。
-
三.代码
#include<iostream>
using namespace std;
int main(){long long n;cin>>n;cout<<n+1;return 0;
}
注意:这里的n的数据范围是10的18次方,所以要把n定义成long long类型
T2.小可吃点心
一.题目要求
小可爱吃甜点,现在桌子上摆着一排n个点心,每个点心具有一个甜度𝑎𝑖ai,小可一次能吃连续的一些点心,但是他一次不能吃总甜度和超过m(可以等于m),否则他就长不高啦!小可想要知道他最少吃几次才能把这些点心都吃完。
输入描述
第一行输入两个整数n,m,代表点心数量和一次可以吃的总甜度上限。
第二行输入n个整数,第i个整数代表第i个点心的甜度𝑎𝑖ai。
输出描述
输出一行,一个整数,代表小可吃的最少次数。
输入样例
5 64 2 4 5 1
输出样例
3
数据描述
0≤𝑛,𝑎𝑖≤100
𝑚𝑎𝑥(𝑎𝑖)≤𝑚
二.解题思路
-
贪心策略:遍历数组,尽可能延长当前子段,直到加入下一个元素会导致甜度和超过 m。
-
终止条件:当累计甜度即将超过 m时,结束当前子段,计数器加 1,并重置累计甜度为当前元素值(因为当前元素需归属到下一段)。
-
边界处理:单个元素甜度若超过 m需单独分段(但题目保证 max(ai)≤m,故无需额外处理)
三.代码
#include<iostream>
using namespace std;
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int n,m,a[105];int cnt=1,sum=0;cin>>n>>m;for(int i=1;i<=n;i++){int x;cin>>x;