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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[ZJOI2010]贪吃的老鼠

發(fā)布時(shí)間:2023/12/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [ZJOI2010]贪吃的老鼠 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

P2570?[ZJOI2010]貪吃的老鼠?

在Ta的博客查看

顯然二分,最大流判定

要滿足兩個(gè)條件:

(1) 在任一時(shí)刻,一只老鼠最多可以吃一塊奶酪;

(2) 在任一時(shí)刻,一塊奶酪最多被一只老鼠吃。

先按照奶酪的邊界進(jìn)行離散化, 變成num個(gè)塊,就可以知道每個(gè)時(shí)間有哪些奶酪了

把每個(gè)老鼠拆成num個(gè)點(diǎn),

初步:

每個(gè)老鼠的每個(gè)時(shí)間的奶酪連接O(len*speed)

首先每個(gè)老鼠每個(gè)時(shí)間段吃的是有限的,顯然保證(1)

但是不能保證(2)

改進(jìn):

考慮讓每一個(gè)奶酪在時(shí)間段只能

?證明不會咕了

(總感覺不能一定能滿足存在一種方案使得總共時(shí)間不會超出)

?

卡精度啊,,,,,

inf設(shè)太大了

并且為了防止被inf卡,可以直接記錄ret表示流出流量,直接返回ret即可

#include<bits/stdc++.h> #define reg register int #define il inline #define fi first #define se second #define mk(a,b) make_pair(a,b) #define numb (ch^'0') #define pb push_back #define solid const auto & #define enter cout<<endl #define pii pair<int,int> #define double long double using namespace std; typedef long long ll; template<class T>il void rd(T &x){char ch;x=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x); } template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');} template<class T>il void ot(T x){if(x<0) putchar('-'),x=-x;output(x);putchar(' ');} template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}namespace Miracle{ const int N=33; const int P=33*33*2+44; const double inf=1e9; const double eps=1e-8; int n,m; struct node{int nxt,to;double w; }e[2*(P*N+N+P)]; int hd[P],cnt=1; int p[N],st[N],nd[N]; int sp[N]; double mem[2*N]; int num; int sum; void add(int x,int y,double z){e[++cnt].nxt=hd[x];e[cnt].to=y;e[cnt].w=z;hd[x]=cnt;e[++cnt].nxt=hd[y];e[cnt].to=x;e[cnt].w=0;hd[y]=cnt; } int d[P]; int s,t; double dfs(int x,double flow){if(x==t) return flow;double res=flow;for(reg i=hd[x];i&&res>eps;i=e[i].nxt){int y=e[i].to;if(e[i].w>eps&&d[y]==d[x]+1){double k=dfs(y,min(res,e[i].w));if(!k) d[y]=0;res-=k;e[i].w-=k;e[i^1].w+=k;}}return flow-res; } int q[P],l,r; bool bfs(){memset(d,0,sizeof d);l=1;r=0;q[++r]=s;d[s]=1;while(l<=r){int x=q[l++];for(reg i=hd[x];i;i=e[i].nxt){int y=e[i].to;if(e[i].w>eps&&!d[y]){d[y]=d[x]+1;q[++r]=y;if(y==t) return true;}}}return false; } int id(int x,int y){return m+(x-1)*num+y; } bool che(double mid){memset(hd,0,sizeof hd);cnt=1;num=0;for(reg i=1;i<=m;++i){mem[++num]=st[i];mem[++num]=nd[i]+mid;}sort(mem+1,mem+num+1);num=unique(mem+1,mem+num+1)-mem-1;--num;//warning!!! s=0,t=id(n,num)+1;for(reg i=1;i<=m;++i){add(i,t,p[i]);}for(reg i=1;i<=n;++i){for(reg j=1;j<=num;++j){for(reg k=1;k<=m;++k){if(st[k]<=mem[j]&&mem[j+1]<=nd[k]+mid){add(id(i,j),k,(double)sp[i]*(mem[j+1]-mem[j]));}}add(s,id(i,j),(double)sp[i]*i*(mem[j+1]-mem[j]));}}double flow=0,ret=0;while(bfs()){while(1){flow=dfs(s,inf);if(flow<eps) break;ret+=flow;}}if(ret+eps>sum) return true;return false; } void clear(){sum=0;s=0;t=0; } bool cmp(int x,int y){return x>y; } int main(){int T;rd(T);while(T--){clear();rd(m);rd(n); for(reg i=1;i<=m;++i){rd(p[i]);rd(st[i]);rd(nd[i]);sum+=p[i];}for(reg i=1;i<=n;++i){rd(sp[i]);}sort(sp+1,sp+n+1,cmp);sp[n+1]=0;for(reg i=1;i<=n;++i){sp[i]-=sp[i+1];}double L=0.0,R=1e7+3;for(reg i=1;i<=60;++i){double mid=(R+L)/2;if(che(mid)) R=mid;else L=mid;}printf("%.10Lf\n",L);}return 0; }} signed main(){Miracle::main();return 0; }/*Author: *Miracle* */

?

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

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的[ZJOI2010]贪吃的老鼠的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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