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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【题解】quake

發布時間:2023/12/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【题解】quake 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【題解】\(quake\)

題目大意

我們共有報酬\(f\)元,一條邊有它的價值\(w_i\),有它的建造時間\(t_i\)。要求建一些邊,生成一顆樹。求最大的利潤率。

數據范圍

\(n\le 400\) \(m\le10000\)

\(Solution\)

實際上\(n,m\)出到\(\le 100000\)應該也是沒問題的。

分數形式?考慮數學表示一下

### \(\frac{f-\Sigma c_i}{\Sigma t_i}\le ans\)

### \(f-\Sigma c_i\le ans\Sigma t_i\)

### \(\Sigma(ans\times t_i + c_i) \le f\)

二分就完事了,然后直接克魯斯卡爾。

#include<bits/stdc++.h>#define RP(t,a,b) for(register int (t)=(a),edd_=(b);t<=edd_;++t) #define DRP(t,a,b) for(register int (t)=(a),edd_=(b);t>=edd_;--t) #define ERP(t,a) for(int t=head[a];t;t=e[t].nx) #define pushup(x) seg[(x)]=seg[(x)<<1]+seg[(x)<<1|1] #define midd register int mid=(l+r)>>1 #define TMP template<class ccf> #define rgt L,R,mid,r,pos<<1|1 #define lef L,R,l,mid,pos<<1 #define all 1,n,1using namespace std;typedef long long ll;typedef long double db; TMP inline ccf Max(ccf a,ccf b){return a<b?b:a;} TMP inline ccf Min(ccf a,ccf b){return a<b?a:b;} TMP inline ccf Abs(ccf a){return a<0?-a:a;} TMP inline ccf qr(ccf k){char c=getchar();ccf x=0;int q=1;while(c<48||c>57)q=c==45?-1:q,c=getchar();while(c>=48&&c<=57)x=x*10+c-48,c=getchar();return q==-1?-x:x; } //-------------template&IO--------------------- const int maxn=405; int r[maxn]; int head[maxn]; int cnt; int n,m; long double F; long double mid; const long double EPS=1e-10;struct S{int fr,to;long double w,t;inline void mk(int FR,int TO,int W,int T){fr=FR;to=TO;w=W;t=T;}inline bool operator <(S a){return t*mid+w<a.t*mid+a.w;} }data[10001];inline void add(int fr,int to,int w,int t){data[++cnt].mk(fr,to,w,t); }inline int q(int x){register int t=x,temp,i=x;while(r[t]!=t) t=r[t];while(r[i]!=i){temp=r[i];r[i]=t;i=temp;}return t; }inline void j(int x,int y){r[q(x)]=q(y);} inline bool in(int x,int y){return q(x)==q(y);}inline bool chek(){RP(t,1,n) r[t]=t;sort(data+1,data+m+1);long double ret=0;RP(p,1,m)if(!in(data[p].fr,data[p].to))ret+=data[p].t*mid+data[p].w,j(data[p].fr,data[p].to);return ret<=F+EPS||ret+EPS<=F; }int t1,t2,t3,t4; int main(){ #ifndef ONLINE_JUDGEfreopen("quake.in","r",stdin);freopen("quake.out","w",stdout); #endifn=qr(1);m=qr(1);F=qr(1);RP(t,1,m){t1=qr(1);t2=qr(1);t3=qr(1);t4=qr(1);add(t1,t2,t3,t4);}long double l=0,r=2000000001;mid=0;if(!chek()){puts("0.0000\n");return 0;}do{mid=(l+r)/(db)2;if(chek())l=mid;elser=mid;}while(l+EPS<r);printf("%.4Lf",l);return 0;}/*分數形式?考慮數學表示一下### $\frac{f-\Sigma c_i}{\Sigma t_i}\le ans$### $f-\Sigma c_i\le ans\Sigma t_i$### $\Sigma(ans\times t_i + c_i) \le f$二分就完事了*/

轉載于:https://www.cnblogs.com/winlere/p/10367969.html

總結

以上是生活随笔為你收集整理的【题解】quake的全部內容,希望文章能夠幫你解決所遇到的問題。

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