Description
話說威威貓有一次去參加比賽,雖然學校離比賽地點不太遠,但威威貓還是想坐出租車去。大學城的出租車總是比較另類,有“拼車”一說,也就是說,你一個人坐車去,還是一堆人一起,總共需要支付的錢是一樣的(每輛出租上除司機外最多坐下4個人)。剛好那天同校的一群Acmer在校門口扎堆了,大家果斷決定拼車去賽場。Input
輸入第一行為T,表示有T組測試數據。每組數據以四個整數N , K , D , S開始,具體含義參見題目描述,接著K行,表示第i輛出租車在第Ti分鐘到達校門,其空余的座位數為Zi(時間按照先後順序)。Output
對於每組測試數據,輸出占一行,如果他們所有人能在比賽前到達比賽地點,則輸出一個整數,代表他們最少需要花的錢(單位:元),否則請輸出“impossible”。Sample Input
1 2 2 10 5 1 1 2 2
Sample Output
14 思路:設dp[i][j]表示前i輛車還剩j個人的最小花費。那麼我們需要去每次枚舉減少的人#include#include #include #include #include using namespace std; const int maxn = 110; const int inf = 0x3f3f3f3f; int dp[maxn][maxn]; int n, k, s, d; int main() { int T; scanf("%d", &T); while (T--) { scanf("%d%d%d%d", &n, &k, &d, &s); for (int i = 0; i <= k; i++) for (int j = 0; j <= n; j++) dp[i][j] = inf; dp[0][n] = 0; int last = 0; for (int i = 1; i <= k; i++) { int t, p; scanf("%d%d", &t, &p); for (int j = n; j >= 0; j--) { if (dp[i-1][j] != inf) { dp[i][j] = min(dp[i][j], dp[i-1][j] + j * (t - last)); for (int l = 1; l <= p; l++) dp[i][j-l] = min(dp[i][j-l], dp[i-1][j] + j * (t - last) + d); } } last = t; } if (dp[k][0] == inf) printf("impossible\n"); else printf("%d\n", dp[k][0]); } return 0; }