日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【NOIP 2018 T3】摆渡车

發(fā)布時(shí)間:2023/12/8 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NOIP 2018 T3】摆渡车 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 前言
  • 題目
    • 題目描述
    • 輸入格式
    • 輸出格式
    • 輸入輸出樣例
      • 輸入1
      • 輸出1
      • 輸入2
      • 輸出2
  • 解析
    • dp轉(zhuǎn)移
      • 初始化
      • 真正的轉(zhuǎn)移
      • Code


前言

誰會(huì)想到這次模擬賽竟然會(huì)原題重考???上午還有人確認(rèn)了不考原題

啊,真香,哎

雖說是原題,但是還是全部都忘完了。。。有了一個(gè)新的思路,調(diào)了接近一個(gè)小時(shí)原以為能AAAbutbutbut竟然只得了353535分,還不如x某十分鐘暴力303030分來得快QwQ

題目

題目描述

nnn 名同學(xué)要乘坐擺渡車從人大附中前往人民大學(xué),第i位同學(xué)在第 tit_iti?分鐘去等車。只有一輛擺渡車在工作,但擺渡車容量可以視為無限大。擺渡車從人大附中出發(fā)、 把車上的同學(xué)送到人民大學(xué)、再回到人大附中(去接其他同學(xué)),這樣往返一趟總共花費(fèi)mmm分鐘(同學(xué)上下車時(shí)間忽略不計(jì))。擺渡車要將所有同學(xué)都送到人民大學(xué)。

凱凱很好奇,如果他能任意安排擺渡車出發(fā)的時(shí)間,那么這些同學(xué)的等車時(shí)間之和最小為多少呢?

注意:擺渡車回到人大附中后可以即刻出發(fā)。

輸入格式

第一行包含兩個(gè)正整數(shù) n,mn,mn,m,以一個(gè)空格分開,分別代表等車人數(shù)和擺渡車往返 一趟的時(shí)間。
第二行包含 nnn 個(gè)正整數(shù),相鄰兩數(shù)之間以一個(gè)空格分隔,第 iii 個(gè)非負(fù)整數(shù) tit_iti?代表第 iii 個(gè)同學(xué)到達(dá)車站的時(shí)刻。

輸出格式

輸出一行,一個(gè)整數(shù),表示所有同學(xué)等車時(shí)間之和的最小值(單位:分鐘)。

輸入輸出樣例

輸入1

5 1 3 4 4 3 5

輸出1

0

輸入2

5 5 11 13 1 5 5

輸出2

4

解析

還是就講以前AAA過的那個(gè)思路吧,畢竟現(xiàn)在這個(gè)我到現(xiàn)在還沒有調(diào)出來QAQ、、、

首先,應(yīng)該能很容易的看出來是個(gè)DPDPDP,但是,應(yīng)該怎么DDD呢??

在這里引入一個(gè)比較好懂的思路,雖然空間耗費(fèi)很比較大。。。

emmm,引入正題……

首先,設(shè)dp[i][j][k]dp[i][j][k]dp[i][j][k]的三維數(shù)組,對,你沒看錯(cuò),就是三維不然我怎么說空間有點(diǎn)大。。 dp[i][j][k]dp[i][j][k]dp[i][j][k]表示第iii個(gè)人還要等jjj分鐘才能坐到車(這里的坐到車的意思是還有jjj分鐘車才會(huì)開,也就是說可能車已經(jīng)到了,但是還得等人),同時(shí)(包括iii)一共有kkk個(gè)人正在等這輛車。

至于為什么會(huì)這么想dpdpdp,額可能是因?yàn)槎S太難想了罷、、、

說完了dpdpdp的定義,現(xiàn)在我們來想想轉(zhuǎn)移。

dp轉(zhuǎn)移

話說dpdpdp最難的就是這里了吧。。。

初始化

首先聲明,這道題是用逆推來做,至于為什么要這么做呢? 我也不知道 (逃

這是因?yàn)樽詈蟮哪菐讉€(gè)狀態(tài)要比最開始的狀態(tài)好想一些呀,不管怎么說,最后所有人都會(huì)被送到對面去。因此我們只需要枚舉有多少人和他一起搭"末班車",他們會(huì)需要等多久才能等到這班車(亦或是車等人)。

for (int i = 0; i <= m; i++)for (int j = 1; j <= n; j++)dp[n][i][j] = i * j;

真正的轉(zhuǎn)移

接下來才是重點(diǎn),剛剛?cè)窍霚愖謹(jǐn)?shù)來著

首先,iii肯定是從大到小枚舉(剛剛已經(jīng)講過了),j、kj、kjk是正向枚舉(其實(shí)反向應(yīng)該也沒有太大問題,只是一般來說都是正向而已,大家可以試試)

然后我們看dp[i][j][k]dp[i][j][k]dp[i][j][k]到底如何轉(zhuǎn)移。有兩種情況:當(dāng)車到的時(shí)候第i+1i+1i+1個(gè)人早就到了;當(dāng)車到的時(shí)候第i+1i+1i+1個(gè)人還沒到。

我們先看第一種情況:

當(dāng)車到的時(shí)候第i+1i+1i+1個(gè)人早就到了。這個(gè)時(shí)候等這個(gè)車的人實(shí)際上又多了一個(gè)。因此dp[i][j][k]=dp[i+1][j?cha[i]][k+1]+cha[i]?kdp[i][j][k] = dp[i + 1][j - cha[i]][k + 1] + cha[i] * kdp[i][j][k]=dp[i+1][j?cha[i]][k+1]+cha[i]?k,這里的chachacha數(shù)組代表著第i個(gè)人和第i+1個(gè)人的時(shí)間差,因此在i+1i+1i+1的狀態(tài)中,加上i+1i+1i+1這個(gè)人共有k+1k+1k+1個(gè)人在等這輛車。

接下來再看第二種情況:

當(dāng)車到的時(shí)候第i+1i+1i+1個(gè)人還沒到,那么在這里我們繼續(xù)分成兩種情況討論,a.a.a.i+1i+1i+1這個(gè)人一起上車;b.b.b.不等這個(gè)人,現(xiàn)在的kkk個(gè)人先走。而在bbb這個(gè)情況中,又會(huì)有兩種情況:1)1)1)i+1i+1i+1個(gè)人不需要等車,直接就能乘到下一輛車;2)2)2)i+1i+1i+1個(gè)人需要等車

因此dp[i][j][k]=min(dp[i+1][0][k+1]+cha[i]?k,dp[i+1][max(j+m?cha[i],0)][1]+j?k)dp[i][j][k] = min (dp[i + 1][0][k + 1] + cha[i] * k, dp[i + 1][max(j + m - cha[i], 0)][1] + j * k)dp[i][j][k]=min(dp[i+1][0][k+1]+cha[i]?k,dp[i+1][max(j+m?cha[i],0)][1]+j?k)

總結(jié)來說,dp[i][j][k]=min{dp[i+1][j?cha[i]][k+1]+cha[i]?k(j&gt;cha[i])min{dp[i+1][0][k+1]+cha[i]?kdp[i+1][max(j+m?cha[i],0)][1]+j?k}(j&lt;=cha[i])}dp[i][j][k] = min \begin{Bmatrix} dp[i + 1][j - cha[i]][k + 1] + cha[i] * k\\ (j &gt; cha[i])\\ min \begin{Bmatrix} dp[i +1][0][k + 1] + cha[i] * k\\ dp[i + 1][max (j + m - cha[i], 0)][1] + j * k \end{Bmatrix}\\ (j &lt;= cha[i]) \end{Bmatrix}dp[i][j][k]=min????????????dp[i+1][j?cha[i]][k+1]+cha[i]?k(j>cha[i])min{dp[i+1][0][k+1]+cha[i]?kdp[i+1][max(j+m?cha[i],0)][1]+j?k?}(j<=cha[i])?????????????

最后輸出dp[1][0][1]dp[1][0][1]dp[1][0][1]就行了。

注意dpdpdp數(shù)組清極大值后,在后面轉(zhuǎn)移時(shí)要判斷!!!

Code

#include <cstdio> #include <cmath> #include <cstdlib> #include <algorithm> #include <vector> #include <set> #include <map> #include <string> #include <queue> #include <stack> #include <cstring> #include <iostream> using namespace std; #define reg register #define LL long long #define INF 0x3f3f3f3ftemplate<typename T> void re (T &x){x = 0;int f = 1;char c = getchar ();while (c < '0' || c > '9'){if (c == '-') f = -1;c = getchar ();}while (c >= '0' && c <= '9'){x = (x << 1) + (x << 3) + c - 48;c = getchar ();}x *= f; }template<typename T> void pr (T x){if (x < 0){putchar ('-');x = ~x + 1;}if (x / 10) pr (x / 10);putchar (x % 10 + 48); }#define N 500 #define M 100int n, m, t[N + 5], cha[N + 5]; int dp[N + 5][M + 5][N + 5];int main (){freopen ("bus.in", "r", stdin);freopen ("bus.out", "w", stdout);re (n); re (m);for (int i = 1; i <= n; i++)re (t[i]);sort (t + 1, t + 1 + n);for (int i = 1; i <= n; i++)cha[i] = t[i + 1] - t[i];memset (dp, INF, sizeof (dp));for (int i = 0; i <= m; i++)for (int j = 1; j <= n; j++)dp[n][i][j] = i * j;for (int i = n - 1; i; i--)for (int j = 0; j <= m; j++)for (int k = 1; k <= i; k++)if (j > cha[i]){int x = dp[i + 1][j - cha[i]][k + 1];if (x == INF) x = 0;dp[i][j][k] = min (dp[i][j][k], x + cha[i] * k);}else{int x1 = dp[i + 1][0][k + 1], x2 = dp[i + 1][max (0, j + m - cha[i])][1];if (x1 == INF) x1 = 0;if (x2 == INF) x2 = 0;dp[i][j][k] = min (dp[i][j][k], min (x1 + cha[i] * k, x2 + j * k));}pr (dp[1][0][1]);putchar (10);return 0; }

總結(jié)

以上是生活随笔為你收集整理的【NOIP 2018 T3】摆渡车的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。