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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

luogu P3786 萃香抱西瓜

發(fā)布時(shí)間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 luogu P3786 萃香抱西瓜 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P3786 萃香抱西瓜


題目背景

伊吹萃香(Ibuki Suika)正在魔法之森漫步,突然,許多西瓜(Suika)從四周飛來,劃出了絢麗的軌跡。雖然陣勢有點(diǎn)恐怖,但她還是決定抱走一些西瓜。


題目描述

萃香所處的環(huán)境被簡化為一個(gè)長為h,寬為w的網(wǎng)格平面。X坐標(biāo)范圍為[1,w],y坐標(biāo)范圍為[1,h]。

她初始(第1個(gè)時(shí)刻)站在坐標(biāo)為sx,sy的方格。

西瓜可能在任意一個(gè)方格出現(xiàn),在每個(gè)時(shí)間單位,它們可能向任何一個(gè)方向移動,也可能靜止不動。西瓜的位置和移動的軌跡是已知的。西瓜的總數(shù)為n個(gè),但只有m個(gè)西瓜可以被萃香抱走,因?yàn)槠渌继罅?#xff0c;可能會砸傷她。

整個(gè)過程會持續(xù)T個(gè)時(shí)刻。萃香希望可以抱走全部的m個(gè)西瓜,并且在任何時(shí)候避免與任何一個(gè)過大的西瓜處在同一位置。抱走的方式為在某個(gè)時(shí)刻,與該西瓜處于同一位置。另外,由于萃香不愿耗費(fèi)過多體力到處亂跑,她每個(gè)時(shí)刻可以選擇靜止不動,也可以選擇移動到相鄰的四個(gè)格子之一,只要不越出環(huán)境邊界。如果選擇移動到相鄰格子,則算作移動了一次。(第1個(gè)時(shí)刻萃香剛站定,無法移動)

在每個(gè)時(shí)刻,如果萃香選擇移動,可以認(rèn)為萃香與西瓜同時(shí)從原來的位置移到了新的位置,沒有先后順序。

萃香想要知道,不被任何一個(gè)大西瓜砸中,并得到所有的m個(gè)小西瓜的情況下,最少需要移動多少次。


輸入輸出格式

輸入格式:

?第一行五個(gè)整數(shù)h,w,T,sx,sy,含義見題目描述。

第二行兩個(gè)整數(shù)n,m,含義見題目描述。

接下來n段數(shù)據(jù),每一段描述了一個(gè)西瓜的出現(xiàn)位置,時(shí)間,移動方式,是否可以被抱走等內(nèi)容,具體如下:

首先一行,兩個(gè)整數(shù)t1,t2,表示西瓜在t1時(shí)刻出現(xiàn), t2時(shí)刻消失。若t2=T+1,表示西瓜在最后一個(gè)時(shí)刻也不消失。保證西瓜至少存在一個(gè)時(shí)刻。

接下來一行一個(gè)整數(shù)a,只能為0或1,0表示這個(gè)西瓜需要避開,1表示這個(gè)西瓜需要抱走。數(shù)據(jù)保證需要抱走的西瓜恰好有m個(gè)。

接下來t2-t1行,每一行兩個(gè)整數(shù)x,y,順序描述了從t1時(shí)刻到t2-1時(shí)刻,該西瓜的坐標(biāo)。西瓜的移動不一定是連續(xù)的,并且是一瞬間完成的,所以無需考慮萃香是否站在了移動路徑上。

?

輸出格式:

?如果萃香在整個(gè)T時(shí)刻內(nèi)無法避免被大西瓜砸中或者無法收集到所有m個(gè)小西瓜,輸出-1,否則輸出一個(gè)整數(shù),表示萃香需要移動的最少次數(shù)。

?


輸入輸出樣例

輸入樣例#1:
5 5 10 3 3 1 1 1 11 1 3 4 5 2 3 5 1 1 5 4 3 4 2 1 1 1 1 1 5 5 輸出樣例#1:
1

說明

樣例說明:第2~4個(gè)時(shí)刻萃香站著不動,在第6個(gè)時(shí)刻,西瓜出現(xiàn)在萃香旁邊,萃香移動到(3,4)位置即可抱走這個(gè)西瓜。

數(shù)據(jù)范圍和提示:

子任務(wù)可能出現(xiàn)兩種特殊性質(zhì)A和B

A: 所有西瓜t1=1,t2=T+1

所有西瓜全程都靜止在原地,不會發(fā)生移動。

B:m=0

共有10個(gè)子任務(wù)。

對于子任務(wù)1,具有特殊性質(zhì)A和B

對于子任務(wù)2~3,僅具有特殊性質(zhì)A

對于子任務(wù)4~5,僅具有特殊性質(zhì)B

對于子任務(wù)6~10,不具有任何一個(gè)特殊性質(zhì)。

對于全部子任務(wù)

1<=所有橫坐標(biāo)范圍<=w 1<=所有縱坐標(biāo)范圍<=h 1<=h,w<=5 1<=T<=100 1<=t1<=T 2<=t2<=T+1 t1<t2 1<=n<=20 0<=m<=10 m<=n

一個(gè)位置不會同時(shí)出現(xiàn)兩個(gè)或以上西瓜。

命題人:orangebird ? (w:%%%出題人dalao


?

出題人玩的一手好梗

狀壓SPFA(想不到吧這倆也能放一起)

因?yàn)橐ё叩膕uika最多只有十個(gè),所以可以想到狀壓,把所有的suika壓成一個(gè)二進(jìn)制數(shù),每一位表示是否抱走了這個(gè)suika

dis[t][x][y][s]表示時(shí)間為t,位置為(x,y),已經(jīng)抱走的suika的集合為s的狀態(tài)下,需要移動的最少次數(shù)

對所有的suika建立一個(gè)三維(t,x,y)的分層圖,標(biāo)記在每個(gè)時(shí)刻哪里有可以抱的小suika(x),哪里有需要躲的大suika(-1),以及哪里沒有suika(0)

然后就可以愉快地跑狀壓SPFA來找suika了☆

……以及出題人的數(shù)據(jù)似乎沒有考慮到起始點(diǎn)有suika的情況?還是s醬提出來的>_<

?

#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int inf=0x3f3f3f3f; int h,w,T,sx,sy,n,m,cnt; int fx[]={0,-1,1,0,0},fy[]={0,0,0,-1,1}; int mp[109][9][9],dis[109][9][9][1024]; bool in[109][9][9][1024]; struct suika{int t,x,y,s;}; queue<suika>q; void spfa(){q.push((suika){1,sx,sy,max(0,1<<mp[1][sx][sy]-1)});memset(dis,0x3f,sizeof(dis));dis[1][sx][sy][max(0,1<<mp[1][sx][sy]-1)]=0;while(!q.empty()){suika cur=q.front();q.pop();int t=cur.t,x=cur.x,y=cur.y,s=cur.s;in[t][x][y][s]=0;if(t==T)continue;for(int k=0;k<=4;++k){int nx=x+fx[k],ny=y+fy[k],nt=t+1,ns=s;if(nx<1||nx>h||ny<1||ny>w||mp[nt][nx][ny]<0)continue;if(mp[nt][nx][ny])ns|=1<<mp[nt][nx][ny]-1;if(dis[nt][nx][ny][ns]>dis[t][x][y][s]+bool(k)){dis[nt][nx][ny][ns]=dis[t][x][y][s]+bool(k);if(!in[nt][nx][ny][ns]){in[nt][nx][ny][ns]=1;q.push((suika){nt,nx,ny,ns});}}}} } int main(){scanf("%d%d%d%d%d",&h,&w,&T,&sx,&sy);scanf("%d%d",&n,&m);for(int i=1;i<=n;++i){int t1,t2,a;scanf("%d%d%d",&t1,&t2,&a);if(!a)a=-1;else a=++cnt;for(int j=t1;j<t2;++j){int x,y;scanf("%d%d",&x,&y);mp[j][x][y]=a;}}if(mp[1][sx][sy]<0){cout<<-1<<endl;return 0;}spfa();int ans=inf;for(int i=1;i<=h;++i)for(int j=1;j<=w;++j)ans=min(ans,dis[T][i][j][(1<<m)-1]);if(ans==inf)ans=-1;cout<<ans<<endl;return 0; } suika

by:wypx


?繼續(xù)吧我luogu的題解粘過來水題解x

狀態(tài)壓縮+spfa

考慮到西瓜的數(shù)量很少,可行的西瓜m<=10;對于每一個(gè)需要拿走的西瓜我們給他一個(gè)重新的編號0~m-1;對這m個(gè)西瓜用一個(gè)單獨(dú)沒有出現(xiàn)過的二進(jìn)制的一位表示。于是拿走西瓜并判斷以前有無拿過這個(gè)西瓜就是當(dāng)前已經(jīng)拿的狀態(tài)now或( | )當(dāng)前西瓜所在的二進(jìn)制位,所得的數(shù)就是當(dāng)前拿到西瓜的狀態(tài)。

對于沒有西瓜的位置當(dāng)前位置是0(當(dāng)前數(shù)或(|)0還是他本身),走到?jīng)]有西瓜的位置對當(dāng)前答案沒有貢獻(xiàn)。

轉(zhuǎn)移

用dis[i][j][t][now]表示當(dāng)前所在點(diǎn)(i,j)時(shí)間為t,當(dāng)前已拿到西瓜的狀態(tài)為now,當(dāng)前的西瓜用x表示(x=1<<y)y是重新分配后當(dāng)前西瓜的編號

  • 1.當(dāng)前點(diǎn)的狀態(tài)是now,當(dāng)前所在點(diǎn)下一秒有一個(gè)西瓜,于是就有dis[i][j][t+1][now|x]=dis[i][j][t][now]

  • 2.當(dāng)前點(diǎn)的狀態(tài)是now,要到達(dá)的地點(diǎn)(to_x,to_y)上有一個(gè)可獲得的西瓜(x),那么到達(dá)這個(gè)點(diǎn)的轉(zhuǎn)移是dis[to_x][to_y][t+1][now|x]=dis[i][j][t][now]+1

  • 3.當(dāng)前點(diǎn)的狀態(tài)是now,要到達(dá)的地點(diǎn)(to_x,to_y)上有一個(gè)不可獲得的西瓜,那么這個(gè)點(diǎn)不能轉(zhuǎn)移.

  • 4.當(dāng)前點(diǎn)的狀態(tài)是now,要到達(dá)的地點(diǎn)(to_x,to_y)沒有西瓜,dis[to_x][to_y][t+1][now]=dis[i][j][t][now]+1

  • 這樣通過上面的4步就可以使在當(dāng)前狀態(tài)合法,不用考慮后續(xù)

于是想到可行的狀態(tài)很少,就可以采用bfs,來實(shí)現(xiàn)轉(zhuǎn)移優(yōu)化,spfa,從(sx,sy)開始把當(dāng)前狀態(tài)&時(shí)間,當(dāng)前所到的點(diǎn)壓成結(jié)構(gòu)體放進(jìn)隊(duì)列.最后拿到所有西瓜的狀態(tài)就是dis[1~h][1~w][T][(1<<m)-1]

因?yàn)橛玫搅藄pfa,所以最終得到的一定是最小的答案。

特殊的,當(dāng)初始點(diǎn)有一個(gè)不可獲得的西瓜時(shí)或最后得到的答案是INF,輸出-1。(不可到達(dá))

#include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<queue> #define ll long long const int Suika_big=2333333; const int maxx=1<<20; using namespace std; const int tx[6]={0,0,0,1,-1}; const int ty[6]={0,1,-1,0,0}; inline int read(){int an=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while('0'<=ch&&ch<='9'){an=(an<<3)+(an<<1)+ch-'0';ch=getchar();}return an*f; } int map[7][7][109],dis[7][7][109][1<<12]; int n,m,h,w,sx,sy,T,cnt; int ans=maxx; bool flag; bool vis[7][7][109][1<<12]; void prepare(){h=read();w=read();T=read();sx=read();sy=read();n=read();m=read();for(int i=1;i<=n;i++){int xx;int t1=read(),t2=read(),Suika_p=read();if(Suika_p)cnt++,xx=1<<cnt-1;else xx=Suika_big;for(int j=t1;j<=min(T,t2-1);j++){int x=read(),y=read();map[x][y][j]=xx;}}if(map[sx][sy][1]==Suika_big){cout<<"-1";flag=1;return;}for(int i=0;i<=h;i++)for(int j=0;j<=w;j++)for(int t=1;t<=T;t++)for(int l=0;l<=(1<<m);l++)dis[i][j][t][l]=maxx; } struct saber{ int x,y,Suika,t; }now; queue<saber>q; void spfa(){q.push((saber){sx,sy,map[sx][sy][1],1});dis[sx][sy][1][map[sx][sy][1]]=0;while(!q.empty()){now=q.front();q.pop();vis[now.x][now.y][now.t][now.Suika]=0;if(now.t>T)continue;for(int i=0;i<=4;i++){int xx=now.x+tx[i];int yy=now.y+ty[i];int melon=now.Suika;if(xx<1||yy<1)continue;if(xx>h||yy>w)continue;int t=now.t+1;if(map[xx][yy][t]==Suika_big)continue;int diss=dis[now.x][now.y][now.t][now.Suika]+(i!=0);melon|=map[xx][yy][t];if(dis[xx][yy][t][melon]>diss){dis[xx][yy][t][melon]=diss;if(!vis[xx][yy][t][melon]){q.push((saber){xx,yy,melon,t});vis[xx][yy][t][melon]=1;}}}} } int main(){prepare();if(flag){return 0;}spfa();for(int i=1;i<=h;i++)for(int j=1;j<=w;j++)ans=min(ans,dis[i][j][T][(1<<m)-1]);if(ans==maxx)cout<<"-1";else cout<<ans;return 0; } Suika

by:s_a_b_e_r


?

轉(zhuǎn)載于:https://www.cnblogs.com/ck666/p/7683856.html

總結(jié)

以上是生活随笔為你收集整理的luogu P3786 萃香抱西瓜的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 91久久久久久久久久久久久 | 亚洲国产果冻传媒av在线观看 | www天天操 | 一级黄毛片 | 国产女厕一区二区三区在线视 | 青青福利视频 | 欧美亚洲激情视频 | 日韩污视频在线观看 | 4hu最新网址 | av一区二区在线播放 | 另类欧美日韩 | 日韩免费在线 | 看黄色大片 | 成人一二三 | 成人免费版 | 日韩免费高清 | 中文字幕精品一区久久久久 | 男人和女人搞鸡 | 久久精品一区二区免费播放 | 波多野结衣绝顶大高潮 | 日本h视频在线观看 | 国产黄色录像片 | 国产成人a亚洲精品 | 国产成人亚洲欧洲在线 | 福利一区视频 | 亚洲成a| 日本午夜视频在线观看 | 久久五月激情 | 亚洲第一天堂 | a天堂视频在线观看 | 双性尿奴穿贞c带憋尿 | 播播激情网 | 中文字幕在线播出 | 日韩av动漫 | 日韩午夜毛片 | 免费一级特黄 | 欧美一级在线 | 欧美三级中文字幕 | 久久一区二区电影 | 久久亚洲国产成人精品性色 | 精品人妻伦九区久久aaa片 | 欧美精品xx | 国产盗摄一区二区三区在线 | 台湾黄色网址 | 91久久精品夜夜躁日日躁欧美 | 伊人网影院 | 日日噜 | 成人做爰69片免费看 | 日韩精品在线免费视频 | 亚洲免费黄色网址 | 中文字幕免费视频 | 亚洲激情a | 免费毛片在线播放免费 | 同性色老头性xxxx老头 | 一本大道久久a久久综合婷婷 | 天堂在线免费视频 | 亚洲系列| 女人脱裤子让男人捅 | 韩国女主播一区 | 欧美a级黄色| 国产亚洲精品网站 | 午夜影院一区二区 | 中文av免费观看 | a资源在线| 成人一区二区av | 久久亚洲视频 | www国产在线观看 | 天堂网2014| 狠狠爱天天干 | 丁香色欲久久久久久综合网 | 国产精品无 | 啪视频在线 | 高清日韩一区二区 | 欧美巨大荫蒂茸毛毛人妖 | 青青av| 亚洲中文字幕一区二区在线观看 | 欧美精品一线 | 不卡av免费 | 午夜888| 黄色骚视频 | 欧美人在线| 免费精品一区 | 人人干在线 | 天堂在线视频网站 | 日本不卡一区二区 | 亚洲高清av在线 | 97免费公开视频 | 久久观看最新视频 | 高潮无码精品色欲av午夜福利 | 波多野结衣在线 | 一区国产精品 | 国产一区二区三区在线看 | 亚洲黄色片视频 | 成人性生交大免费看 | 无码人妻av一区二区三区波多野 | 青青操视频在线观看 | 制服丝袜一区二区三区 | 龚玥菲一级淫片 | 九色视频在线观看 |