1004. 西西弗斯式的命运

本题基于古希腊神话中的西西弗斯故事,描述了一个算法问题,旨在求解角色在限定时间内能行走的最远距离。题目提供了一条被划分为多个区间的路径,并定义了不同地形的行走耗时。

Description

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

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

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

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

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

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

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

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秒,如果他跑得更远,就无法按时回到起点。

#include <iostream>
#include <stdio.h>
using namespace std;

int main(){
	//freopen("1.txt","r",stdin);
	long M,T,U,F,D;
	long count_time = 0;
	long count_length = 0;
	cin >> M >> T >> U >> F >> D;
	for (int i = 0; i <= T; i++){
		char Si;
		cin >> Si;
		if (Si == 'u' || Si == 'd'){
			if (count_time + U + D > M)
				break;
			else
				count_time += (U+D); 
		}else if (Si == 'f'){
			if (count_time + 2 * F > M)
				break;
			else
				count_time += 2*F;
		}
		count_length += 1; 
	}
	
	cout << count_length;
	return 0;
	
}

### C++ 实现西西弗斯数字黑洞算法 西西弗斯数字黑洞(也称为123黑洞),是一种基于特定规则的数学现象。其核心逻辑是对输入的自然数不断提取其中偶数、奇数的数量及其总数,并通过这些数值重新构建新的数字,直到最终收敛至固定的值 `123`。 以下是完整的 C++ 程序实现: #### 代码实现 ```cpp #include <iostream> #include <string> using namespace std; // 函数:计算给定字符串表示的数字中偶数、奇数数量及总长度 void countEvenOdd(const string& numStr, int& evenCount, int& oddCount) { evenCount = 0; oddCount = 0; for (char c : numStr) { // 遍历每一位字符 if (c >= '0' && c <= '9') { // 确保是有效数字 int digit = c - '0'; if (digit % 2 == 0) { evenCount++; // 偶数计数器加一 } else { oddCount++; // 奇数计数器加一 } } } } int main() { string inputNum; cout << "请输入一个自然数:" << endl; cin >> inputNum; while (true) { // 循环直至达到123 int m = 0, n = 0; // 初始化偶数和奇数计数器 // 计算当前数字串中的偶数和奇数个数 countEvenOdd(inputNum, m, n); int sum = m + n; // 总位数等于偶数与奇数之和 // 构造新的数字字符串 string newNum = to_string(m) + to_string(n) + to_string(sum); // 输出中间状态以便观察过程 cout << "当前数字: " << inputNum << ", 下一步数字: " << newNum << endl; // 如果已经到达123,则退出循环 if (newNum == "123") break; // 更新inputNum为下一步的新数字 inputNum = newNum; } cout << "已进入西西弗斯数字黑洞,结果为123." << endl; return 0; } ``` --- #### 关键点解析 1. **函数设计** - 使用辅助函数 `countEvenOdd` 来统计输入字符串中偶数和奇数的数量[^1]。 - 主程序负责读取用户输入并执行迭代操作,每次更新后的数字作为下次运算的基础。 2. **终止条件** - 当生成的新数字为 `"123"` 时停止循环,因为这是该算法的目标值[^4]。 3. **数据结构选择** - 将数字转换为字符串形便于逐位分析,简化了对每位数字的操作流程[^2]。 4. **鲁棒性考虑** - 对于非法输入(如负数或非纯数字字符串),可以通过额外验证来增强程序健壮性,但在本例中假设输入均为合法自然数。 --- #### 示例运行 假设有如下交互场景: - 用户输入:`1234567890` - 中间输出逐步展示每轮变换的过程,最终稳定在 `123`. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值