話說小 x 有一次去參加比賽,雖然學校離比賽地點不太遠,但小 x 還是想坐 計程車去。大學城的計程車總是比較另類,有「拼車」一說,也就是說,你乙個人 坐車去,還是一堆人一起,總共需要支付的錢是一樣的(每輛出租上除司機外最 多坐下 4 個人)。剛好那天同校的一群 oier 在校門口扎堆了,大家果斷決定拼車 去賽場。
問題來了,一輛又一輛的計程車經過,但裡面要麼坐滿了乘客,要麼只剩下 一兩個座位,眾 oier 都覺得坐上去太虧了,小 x 也是這麼想的。
假設 n 位 oier 準備拼車,此時為 0 時刻,從校門到目的地需要支付給出租
車師傅 d 元(按車次算,不管裡面坐了多少 oier),假如 s 分鐘後恰能趕上比賽,
那麼 s 分鐘後經過校門口的計程車自然可以忽略不計了。現在給出在這 s 分鐘當
中經過校門的所有的 k 輛計程車先後到達校門口的時間 t i 及裡面剩餘的座位 zi
(1 <= zi <= 4),oier 可以選擇上車幾個人(不能超過),當然,也可以選擇上 0 個
人,那就是不坐這輛車。
俗話說,時間就是金錢,這裡小 x 把每個 oier 在校門等待計程車的分鐘數 等同於花了相同多的錢(例如小 x 等待了 20 分鐘,那相當於他額外花了 20 元錢)。
在保證所有 oier 都能在比賽開始前到達比賽地點的情況下,聰明的你能計 算出他們最少需要花多少元錢麼?
輸入格式:
每組資料以四個整數 n , k , d , s 開始,具體含義參見題目描述。
接著 k 行,表示第 i 輛計程車在第 ti 分鐘到達校門,其空餘的座位數為 zi
(時間按照先後順序)。
n <= 100,k <= 100,d <= 100,s <= 100,1 <= zi <= 4,1<= t(i) <= t(i+1) <= s
輸出格式:
對於每組測試資料,輸出佔一行,如果他們所有人能在比賽前到達比賽地點,
則輸出乙個整數,代表他們最少需要花的錢(單位:元),否則請輸出「impossible」
輸入樣例#1:複製
2 2 10 5
1 12 2
輸出樣例#1:複製
14
類揹包問題(其中注意揹包也有不滿的情況,由於之前沒考慮到這個問題被卡了好久),狀態方程為 dp[i][j]=min(dp[i-1][j-l]+l*t[i]+d*(l!=0),dp[i][j])(其中dp[i][j]表示位i輛車搭載j個人所花費的最少費用)
**如下:
#include#include#include#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int n=105;
const int inf=1e9+5;
int t[n],z[n];
int dp[n][n];
int main()
} int cnt=0;
for(int i=1;i<=k;i++)
for(int i=1;i<=k;i++)
else
dp[i][j]=min(dp[i-1][j-l]+l*t[i]+d*(l!=0),dp[i][j]);
} }} if(cntcout<<"impossible"
cout
}
P1977 計程車拼車
話說小 x 有一次去參加比賽,雖然學校離比賽地點不太遠,但小 x 還是想坐 計程車去。大學城的計程車總是比較另類,有 拼車 一說,也就是說,你乙個人 坐車去,還是一堆人一起,總共需要支付的錢是一樣的 每輛出租上除司機外最 多坐下 4 個人 剛好那天同校的一群 oier 在校門口扎堆了,大家果斷決定拼...
C語言訓練 計算1977!
題目描述 編寫乙個程式,計算1977!的值,輸入 輸出 提示 1977!的值超過計算機所能表示的整數範圍,請考慮其他技巧,假設 1977!之值不超過10000位用乙個含有10000個元素的整型陣列num表示其結果,每個元素存放一位,num 0 存入個位數,num存入十 位數,依次類推 8!40320...
專題訓練之dp
五 本專題題解 我所理解的dp,就是要求多階段的問題解 或可以轉換為多階段的問題最優解 求出每個階段的解,最終推出答案。既將大問題轉換為乙個個小問題,並將這些小問題的答案儲存下來,在解決後面的小問題或者最終的大問題時可以用到。剛開始接觸dp的時候,感覺和貪心區別不太大,兩者的寫法都基本相似 實際為貪...