洛谷p4851 yyf hates ganhuodong java题解

题目链接

题目背景

非酋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);
	    }
    }   

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值