日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 95久久| 欧洲亚洲女同hd | 求个黄色网址 | 伊人影院在线视频 | 免费看的av网站 | 国产精品污www一区二区三区 | 亚洲av成人无码一二三在线观看 | 久久欧美精品 | 欧美一区二区在线 | 日韩成人精品一区二区三区 | 亚洲男女啪啪 | 日本在线视频播放 | 国产精品桃色 | 国产精品视频入口 | 日本免费黄色网址 | 国产又粗又猛又黄又爽视频 | 午夜激情免费 | 99精品一级欧美片免费播放 | 国产不卡免费视频 | 久久久网站 | 99热在线观看精品 | 一极毛片 | 天堂аⅴ在线最新版在线 | 欧美一区二区三区在线 | 亚洲av第一成肉网 | 影音先锋男人站 | 日皮视频网站 | 青青草一区二区三区 | 国产精品jizz在线观看无码 | 男人天堂av在线播放 | 中文字幕在线观看免费高清 | 久久精品国产亚洲AV成人婷婷 | 老师张开让我了一夜av | 日本一区中文字幕 | 无码人妻精品一区二区三应用大全 | jizz成熟丰满老女人 | 老司机在线看片 | 日本视频在线免费 | 国产亚洲精品熟女国产成人 | 中文字幕第66页 | juliaann欧美二区三区 | 久久国产香蕉视频 | 免费超碰在线 | 欧美综合亚洲图片综合区 | 卡一卡二视频 | 日本免费一区二区在线 | 国产精久久久久久 | 天天干天天干 | 亚洲资源在线播放 | 外国av网站 | 国产精品第一页在线观看 | 91精选 | 成人午夜视频精品一区 | 日韩一级片免费在线观看 | 小嫩嫩12欧美 | 瑟瑟网站在线观看 | 欧美乱欲视频 | 一区二区激情视频 | 久久久久区 | 五月色婷| 欧美日韩在线高清 | 99精品无码一区二区 | 720url在线观看免费版 | 特高潮videossexhd | 国产一区二区久久精品 | 小蝌蚪av | 黄色av高清 | 黄色片视频免费 | 少妇精品久久久久www | 吸咬奶头狂揉60分钟视频 | 亚洲欧美日本一区二区三区 | 99久久久久 | 91秦先生在线播放 | 天堂а在线中文在线新版 | 国产在线观看免费视频软件 | 91视频首页 | 大黑人交xxx极品hd | 国产一区综合 | 欧美激情精品久久久久久免费 | 日韩在线精品 | 91视频在线观看视频 | 79日本xxxxxxxxx18 婷婷亚洲一区 | 亚洲国产成人无码av在线 | 欧美人妻精品一区二区三区 | 欧美zozo| 丁香婷婷一区二区三区 | 久久视精品| 国产夫妻性生活 | 婷婷色综合网 | 99热这里只有精品在线观看 | 在线观看涩涩视频 | 韩国伦理片在线看 | 91插插插插插插插 | 日产久久久久久 | 动漫精品一区二区三区 | 欧美性猛交aaaa片黑人 | 欧美亚洲大片 | 黄三级 | 在线看黄网站 |