1. 程式人生 > >SJTUOJ 1004. 西西弗斯式的命運

SJTUOJ 1004. 西西弗斯式的命運

問題內容

Description
古希臘有個關於西西弗斯的神話:

西西弗斯被眾神判決推運一塊石頭至山頂。由於巨石本身的重量,它被推到山頂卻又總要滾下山腳。於是西西弗斯又得把石塊推上山去。如此反覆,永無止境,沒有盡頭。眾神認為,讓西西弗斯服這永恆的勞役是最嚴酷的懲罰。

二哥被押入地獄。他被眾神判決扛著一塊巨磚在山路上走,再原路返回,如此反覆,沒有盡頭。

眾神規定二哥獨自走山路的時間不得超過M秒( 1≤M≤10,000,000 )。整條山路被劃分成T個長度相同的小段( 1≤T≤100,000 ),並且,眾神用Si表示第i個小段的路況。Si為u,f,d這3個字母之一,它們分別表示第i個小段是上坡、平地、下坡。

二哥要花U秒( 1≤U≤100 )才能走完一段上坡路,走完一段平地的耗時是F秒( 1≤F≤100 ),走完一段下坡路要花D秒( 1≤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 <stdio.h>
int main()
{
    int m,t,u,f,d,sum,c;
    char s[2];
    
    sum = 0;
    while(scanf("%d %d %d %d %d",&m,&t,&u,&f,&d)!=EOF)
    {
        c=0;
        while(t--){
            scanf("%s",s);
            if(sum <= m){
                if('f'!=s[0]){
                    sum+=(u+d);
                }
                else{
                    sum += (f+f);
                }
                if(sum <= m){
                    c++;
                }
            }
        }
        printf("%d",c);
    }
    return 0;
}

時間:25ms 空間:9104kb