西西弗斯式的命运

http://acm.sjtu.edu.cn/OnlineJudge/problem/1004


Description

古希腊有个关于西西弗斯的神话:

西西弗斯被众神判决推运一块石头至山顶。由于巨石本身的重量,它被推到山顶却又总要滚下山脚。于是西西弗斯又得把石块推上山去。如此反复,永无止境,没有尽头。众神认为,让西西弗斯服这永恒的劳役是最严酷的惩罚。

二哥被押入地狱。他被众神判决扛着一块巨砖在山路上走,再原路返回,如此反复,没有尽头。

众神规定二哥独自走山路的时间不得超过M秒(  1M10,000,000  )。整条山路被划分成T个长度相同的小段(  1T100,000  ),并且,众神用Si表示第i个小段的路况。Si为u,f,d这3个字母之一,它们分别表示第i个小段是上坡、平地、下坡。

二哥要花U秒(  1U100  )才能走完一段上坡路,走完一段平地的耗时是F秒(  1F100  ),走完一段下坡路要花D秒(  1D100  )。注意,沿山路原路返回的时候,原本是上坡的路段变成了下坡路,原本是下坡的路段变成了上坡路。

二哥对生活充满激情,但他遭受着难以用言语尽述的非人折磨:痛苦扭曲的脸,被巨砖死死压住的抖动的肩膀,沾满泥土的双脚,呕心沥血,不停的工作。这是典型的西西弗斯式的命运。贝多芬,歌德,叔本华,你才,还有高斯,爱因斯坦的命运,都是典型的西西弗斯式的命运,无一例外。

众神想让二哥能在按时返回的前提下,走最远的路。所以众神向知道他最多能在这条山路上走多远。

Input Format

第1行:5个空格隔开的整数:M,T,U,F,D。

第2..T+1行:第i+1行有一个字母Si,描述第i段山路的路况。

Output Format

一行,有一个整数为二哥在按时回到起点前提下,最多能跑到多远。

Sample Input

13 5 3 2 1
u
f
u
d
f

Sample Output

3

样例解释

众神规定二哥的最大耗时为13秒,他跑步的山路一共被划分成5段。二哥走完一段上坡的耗时为3秒,平地为2秒,下坡为1秒。

二哥走完山路的前3段,然后返回,总耗时为3+2+3+1+2+1=12秒,如果他跑得更远,就无法按时回到起点。


*************************************************************************************************************************

用两个数组来保存去到i 段是用的秒数,和从第i段回来用的秒数。

这道题比较简单,就直接上代码了

#include <iostream>
#include <string>
using namespace std;


int main()
{
	unsigned int M;     //最去回秒数
	unsigned int T;     //山路段数
	unsigned int U;     //上坡秒数
	unsigned int F;     //平路秒数
	unsigned int D;     //下坡秒数
	char road;
	cin>>M>>T>>U>>F>>D;
	unsigned int *go = new unsigned int[T];
	unsigned int *back = new unsigned int[T];
	for(unsigned int i = 0 ; i< T; i ++)
	{
		go[i] = 0;
		back[i] = 0;
	}
	for(unsigned int i = 0; i < T; i++)
	{
		cin>>road;
		switch(road)
		{
		case 'u':
			if(0 == i)
			{
				go[i] = U;
				back[i] = D;
			}
			else
			{
				go[i] = U + go[i-1];
				back[i] = D + back[i-1];
			}
			break;
		case 'f':
			if(0 == i)
			{
				go[i] = F;
				back[i] = F;
			}
			else
			{
				go[i] = F + go[i-1];
				back[i] = F + back[i-1];
			}
			break;
		case 'd':
			if(0 == i)
			{
				go[i] = D;
				back[i] = U;
			}
			else
			{
				go[i] = D + go[i-1];
				back[i] = U + back[i-1];
			}
			break;
		}
	}

	int j = 0;
	while((go[j]+back[j]) <= M && j < T)
	{j++;}

	cout<<j;

	return 0;
}

时间:0ms / 内存:48024kb



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值