首页 > 编程语言 >P1095 守望者的逃离(C++_贪心_模拟/dp)

P1095 守望者的逃离(C++_贪心_模拟/dp)

时间:2023-06-20 10:05:49浏览次数:45  
标签:10 魔法值 int 闪现 C++ 守望者 P1095 dp


题目描述

恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变。守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上。为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会沉下去。到那时,岛上的所有人都会遇难。守望者的跑步速度为17m/s,以这样的速度是无法逃离荒岛的。庆幸的是守望者拥有闪烁法术,可在1s内移动60m,不过每次使用闪烁法术都会消耗魔法值10点。守望者的魔法值恢复的速度为4点/s,只有处在原地休息状态时才能恢复。

现在已知守望者的魔法初值M,他所在的初始位置与岛的出口之间的距离S,岛沉没的时间T。你的任务是写一个程序帮助守望者计算如何在最短的时间内逃离荒岛,若不能逃出,则输出守望者在剩下的时间内能走的最远距离。注意:守望者跑步、闪烁或休息活动均以秒(s)为单位,且每次活动的持续时间为整数秒。距离的单位为米(m)。

输入格式

共一行,包括空格隔开的三个非负整数M,S,T。

输出格式

共两行。

第1行为字符串“Yes”或“No”(区分大小写),即守望者是否能逃离荒岛。

第2行包含一个整数。第一行为“Yes”(区分大小写)时表示守望者逃离荒岛的最短时间;第一行为“No”(区分大小写)时表示守望者能走的最远距离。

输入输出样例

输入 #1

39 200 4

输出 #1

No
197

输入 #2

36 255 10

输出 #2

Yes
6

说明/提示

30%的数据满足:P1095 守望者的逃离(C++_贪心_模拟/dp)_数据

50%的数据满足:P1095 守望者的逃离(C++_贪心_模拟/dp)_数据_02

100%的数据满足:P1095 守望者的逃离(C++_贪心_模拟/dp)_数据_03.

思路

第一段模拟的思路应该在代码的注释中写的很清楚了,有点写复杂了,应该一个dp就可以结束的!!!!!!!!!第二段代码是dp。

Code1

(贪心+模拟)
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int m, s, t, flag = 0;//m初始魔法, s距离出口的距离, t剩余时间
	cin >> m >> s >> t;
	int S = s, T = t;
	float temp;
	if (s == 0)
		flag = 1;
	while (t > 0 && (m >= 10 || (ceil((10 - m) / 4.0) + 1 <= t) && s > ((ceil((10 - m) / 4.0) + 1) * 17))){//(剩余魔法值还可以支持闪现)或者(剩余时间内还可以攒闪现并且有1s的时间可以闪出去而且还要比跑着用时更短)
		if (m < 10){//魔法值余量不足
			t -= (ceil((10 - m) / 4.0) + 1);//减去原地不动的时间和闪现的一秒
			m += (ceil((10 - m) / 4.0) * 4 - 10);//原来的魔法值加上攒出的魔法值减去闪现需要消耗的魔法值
		}
		else{
			t -= 1;//时间减去一秒闪现的时间
			m -= 10;//魔法值减去一次闪现的魔法值
		}
		s -= 60;//距离缩短一个闪现的距离
		if (s <= 0){//闪现过头了,说明ok
			flag = 1;
			break;
		}
	}
	if (flag == 0)//只靠闪现不足以出去或者不是最优
		while (t--){//剩余的时间内全部跑步
			s -= 17;
			if (s <= 0){
				flag = 1;
				break;
			}
		}
	if (flag == 1)
		cout << "Yes" << endl << T - t;
	else
		cout << "No" << endl << S - s;
	return 0;
}

Code2

(贪心+dp)
#include<bits/stdc++.h>
using namespace std;
int dp[300010];
int main()
{
	int m, s, t;
	cin >> m >> s >> t;
	for (int i = 1; i <= t; i++)//闪现
		if (m >= 10)
		{
			dp[i] = dp[i - 1] + 60;
			m -= 10;
		}
		else
		{
			dp[i] = dp[i - 1];
			m += 4;
		}
	for (int i = 1; i <= t; i++)//跑步
	{
		dp[i] = max(dp[i], dp[i - 1] + 17);
		if (dp[i] >= s)
		{
			cout << "Yes" << endl << i;
			return 0;
		}
	}
	cout << "No" << endl <<dp[t];
	return 0;
}


标签:10,魔法值,int,闪现,C++,守望者,P1095,dp
From: https://blog.51cto.com/u_16165815/6520486

相关文章

  • PTA_乙级_1006 换个格式输出整数(C++_模拟)
    让我们用字母B来表示“百”、字母S表示“十”,用12…n来表示不为零的个位数字n(<10),换个格式来输出任一个不超过3位的正整数。例如234应该被输出为BBSSS1234,因为它有2个“百”、3个“十”、以及个位的4。输入格式:每个测试输入包含1个测试用例,给出正整数n(<1000)。输......
  • PAT (Advanced Level)_1100 Mars Numbers (20分)(C++_模拟)
    PeopleonMarscounttheirnumberswithbase13:ZeroonEarthiscalled"tret"onMars.Thenumbers1to12onEarthiscalled"jan,feb,mar,apr,may,jun,jly,aug,sep,oct,nov,dec"onMars,respectively.Forthenexthigherdigi......
  • PAT_Advanced Level_1080 Graduate Admission(C++_模拟_快排_卡常)
    Itissaidthatin2011,thereareabout100graduateschoolsreadytoproceedover40,000applicationsinZhejiangProvince.Itwouldhelpalotifyoucouldwriteaprogramtoautomatetheadmissionprocedure.Eachapplicantwillhavetoprovidetwograd......
  • 数据结构代码整理_基于邻接表存储结构的有向图的实现(C++)
    目录RequirementsDebuggingEnvironmentChatCode1.graph.h2.test.cppRequirements       基于邻接表存储结构实现有向图的典型操作(构造、析构、增加顶点、删除顶点、增加弧、删除弧,查找一个顶点、判空、判满、图中顶点个数、邻接表中指定顶点的第一个邻接顶点、深度优先......
  • CCF_201912-2 回收站选址(C++_暴力_枚举)
    思路本来想用dfs来着,有垃圾的地方就标一后来看到数的大小为,数量却只有就果断暴力了…Code#include<bits/stdc++.h>//暴力枚举usingnamespacestd;typedeflonglongll;llx[1010],y[1010],num[1010],score[1010],ans[10];intmain(){ intn; cin>>n; for(inti=......
  • PTA_乙级_1002 写出这个数(C++_模拟)
    读入一个正整数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。输入格式:每个测试输入包含1个测试用例,即给出自然数的值。这里保证小于。输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1空格,但一行中最后一个拼音数字后没有空格。输入样例:1234567890987654......
  • 呼叫中心的离散事件模拟(C++_模拟)
    题目       模拟网上书店的电话接待台接电话(离散事件)的过程。用户在打电话咨询时,先输入自己的标识(如姓名或会员号),然后进入排队等待被接听电话。xauat服务人员会根据该用户在书店已购买书籍的累计消费情况对拨入的电话进行排序。累计消费超过3000元的为1类用户,最先得......
  • 逆波兰式求值(C++_模拟)
    题目       将中缀表达式翻译成后缀表达式(逆波兰表达式)时,可以去掉中缀表达式中出现的括号,简化表达式。如中缀表达式“(2+3)6”被转成后缀表达式“23+6”后,可以借助于栈对表达式求值,完成运算。规则大致如下:       遇到操作数,则入栈;       遇到二元运算符,则......
  • P1203 [USACO1.1]坏掉的项链Broken Necklace(C++_模拟_暴力枚举_优化)
    题目描述你有一条由n个红色的,白色的,或蓝色的珠子组成的项链,珠子是随意安排的。这里是n=29的两个例子:第一和第二个珠子在图片中已经被作记号。图片A中的项链可以用下面的字符串表示:brbrrrbbbrrrrrbrrbbrbbbbrrrrb假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集......
  • P1582 倒水(C++_数论_进制)
    题目描述一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)显然在某些情况下CC无法达到目标,比......