题目背景
非酋yyf知道自己太非了,于是他开始爆肝活动。yyf终于成为了一名肝帝,但他还是想尽量节省loveca的花费,不然的话如果花了太多lovecayyf会心疼的。
题目描述
给你如下11个正整数:
a:完成一首歌曲所能获得的活动pt
b:完成一首歌曲所需的LP
c:你开始肝活动时的LP上限
d:你开始肝活动时的LP
e:你开始肝活动时的经验值上限
f:你开始肝活动时的经验值
g:打一首歌能获得的经验值
h:升一级增加的LP.上限
k:升级增加的经验值上限
x:离活动结束的剩余时间(小时)
y:你的目标活动pt
假设yyf打歌不需要花费时间,每打一首歌需要花费-定的LP来获取一定的活动pt以及-定的经验值。
yyf的初始活动pt为0
LP每小时自动恢复1点, LP达到上限后不会自动恢复(本题不需考虑这种情况) , 可以通过后文所述
方式超过上限。
经验值达到上限后会升级,升级时会增加LP.上限并恢复”新的LP上限”(增加后的)点LP,恢复后的
LP可以超过LP上限,且溢出的经验值会计入下一次升级,下一次升级所需要的经验值(经验值上限)
会增加。
可以随时耗费一个loveca来获得当前LP.上限点LP (可以超过上限)。
你的目标是获得大于等于y的活动pt,请求出最少要耗费多少个loveca。
形式化地说,你初始的LP可以视作d + x,你有两种操作:
1.设你操作前的经验值为exp, LP. 上限为LPmax, LP值为l (当且仅当l≥b时能进行操作1 ),
经验值上限为EXPmax,则在你操作后活动pt加上a。.
●若exp+g≥EXPmax,则你的剩余LP值为l- b+ LPmax + h,经验值为
(exp + g) mod EXPmax, LP.上限加上h,经验值上限加上k
●否则你的剩余LP值为l- b,经验值为exp+ g
2.设你操作前的LP上限为LPmax, LP值为l,则你操作后的剩余LP值为LPmax + l
你的目标为使你的活动pt大于等于y,求出最少要的操作2数量
由于打歌不计时间可以在活动结束的瞬间打任意次歌,即进行任意次操作1,也就是初始LP可以视作d+x
输入格式
共一行,为上述所有共11个正整数,含义如上所述
输出格式
一个正整数,代表最少需要耗费的loveca数量
输入输出样例
输入 | 输出 |
9 7 46 6 114 50 17 6 18 11 9118 | 7 |
说明/提示
a∈[1,10]
b∈[5, 20]
c∈[30, 50]
d∈[5, 10]
e∈[100, 200]
f∈[1,50]
g∈[10, 20]
h∈[5, 10]
k∈[10, 20]
x∈[10, 15]
y∈[5000, 10000]
题解
1.题目说的情况与现在很多游戏的体力机制一样,可以将LP看成体力,PT看成积分,用LOVECA来买LP体力。
2.看输出需求,用一个整数数组接收:
Scanner in =new Scanner(System.in);
int[] arr=new int[11];
for(int i=0;i<arr.length;i++) {
arr[i]=in.nextInt();
}
3.先写题目需要定的东西:
int a=arr[0]; //完成一首可得PT
int b=arr[1],c=arr[2],d=arr[3]; //一首歌要的LP;LP上限;LP初始值
int e=arr[4],f=arr[5],g=arr[6]; //EXP上限;EXP初始;一首歌可得EXP;
int h=arr[7],k=arr[8]; //升级增加LP;升级增加EXP;
int x=arr[9],y=arr[10]; //活动结束时间,目标PT;
int LP=d,PT=0,EXP=f; //LP体力;PL积分;EXP经验
int LOVECA=0; //买LP
4.把升级的情况写了,要求如下:
经验值达到上限后会升级,升级时会增加LP.上限并恢复”新的LP上限”(增加后的)点LP,恢复后的
LP可以超过LP上限,且溢出的经验值会计入下一次升级,下一次升级所需要的经验值(经验值上限)
会增加。
//升级系统
if(EXP>=e) {
int more=EXP-e;
e+=k;
c+=h;
LP+=c;
EXP=0+more;
}
5.如果LP用完了,有两种补LP的方法,一个是时间,另一个是用LOVACA。因为题目要求用最少的LOVECA,所以先用时间补,等把活动时间补完了再用LOVECA补:
if(x>0) { //x是活动时间,先用时间补LP
if(LP<c) {
LP++;
}
x--;
}
else { //消耗LOVACA补LP
if(LP<b) {
LP+=c;
LOVECA++;
}
}
6.在达到活动PT前一直打歌:
while(PT<y) { //判断有没有完成任务
if(LP>=b) { //有PT时打歌
PT+=a;
EXP+=g;
LP-=b;
}
}
7.把上面板块组合在一起,最后在输出消耗的LOVECA
参考代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
public static void main(String[] args) {
Scanner in =new Scanner(System.in);
int[] arr=new int[11];
for(int i=0;i<arr.length;i++) {
arr[i]=in.nextInt();
}
int a=arr[0]; //完成一首可得PT
int b=arr[1],c=arr[2],d=arr[3]; //一首歌要的LP;LP上限;LP初始值
int e=arr[4],f=arr[5],g=arr[6]; //EXP上限;EXP初始;一首歌可得EXP;
int h=arr[7],k=arr[8]; //升级增加LP;升级增加EXP;
int x=arr[9],y=arr[10]; //活动结束时间,目标PT;
int LP=d,PT=0,EXP=f; //LP体力;PL积分;EXP经验
int LOVECA=0; //买LP
while(PT<y) { //判断有没有完成任务
if(LP>=b) { //有PT时打歌
PT+=a;
EXP+=g;
LP-=b;
if(EXP>=e) { //升级
int more=EXP-e;
e+=k;
c+=h;
LP+=c;
EXP=0+more;
}
}
else if(x>0) { //没LP,先用时间
if(LP<c) {
LP++;
}
x--;
}
else { //消耗LOVACA补LP
if(LP<b) {
LP+=c;
LOVECA++;
}
}
}
System.out.println(LOVECA);
}
}