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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【2018NOIP普及组】T3 摆渡车

發布時間:2023/12/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【2018NOIP普及组】T3 摆渡车 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P5017 擺渡車
題目傳送門
思路:

  • 對于每一個人他的最長等待時間為m-1。車剛走,他下分鐘到。
  • f[i][j]表示第i個人等j分鐘的所有人的最小等待時間(最優解)。注意:第i個人等0分鐘(他來就開車),不一定是最優的。
  • 深搜第i人在開車時間為st時得最優解,把它的值賦給f[i][st-a[i]]; (記憶化)
  • 第i個人在開車時間為st時,這班車上(車)的人總等待時間=st*(j-i)-sum;sum為上車的人到達時間和。然后再加上第j個人,開車時間為(st+m)的最優值(dfs(j,st+m),我們就初步得到一個最優解(不一定是最優的)
  • 接下來對于best,我們還需更新最優值;(如果 第i個人后還有人沒上車,那么以st為開車時間不一定是最優的)這里我給出一種情況,大家就比較好理解了。只有2個人,第一個1分鐘時到,第二個人2分鐘到,m=10,st=1并不是最優的。
    要想不超時,記憶化+剪枝是法寶!
  • #include<cstdio> #include<iostream> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<vector> #define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout); using namespace std; const int MAX=2147483647; const int N=5e2+5; int a[N],f[N][N],n,m; //f[i][j] 表示第i個人等待j分鐘時,所有人的最少等待時間; void input() {scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);sort(a+1,a+1+n); } int dfs(int i,int st) { //記憶化搜索。i:第i個人,st:開車時間if(i>n) return 0; //所有人都搞定了if(st<a[i]) return dfs(i,a[i]);//如果現在的時間沒有人,就到下一個人的到達時間if(f[i][st-a[i]]) return f[i][st-a[i]];int sum=0,j=i; //車等人 while(j<=n&&a[j]<=st) sum+=a[j++];int best=st*(j-i)-sum+dfs(j,st+m);//人等車for(;j<=n;j++){sum+=a[j];best=min(a[j]*(j-i+1)-sum+dfs(j+1,a[j]+m),best);}return f[i][st-a[i]]=best; //記憶化 } int main() {//fre();input();cout<<dfs(1,a[1]);return 0; }

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。