洛谷4951 地震 bzoj1816扑克牌 洛谷3199最小圈 / 01分数规划

时间:2023-03-08 17:45:44

  

洛谷4951 地震

 #include<iostream>
#include<cstdio>
#include<algorithm>
#define go(i,a,b) for(register int i=a;i<=b;i++)
#define ll long long
#define db long double
#define M 10001
#define N 401
#define inf 1e15
#define eps 1e-12
using namespace std;
ll read()
{
ll x=,y=;char c=getchar();
while(c<''||c>'') {if(c=='-') y=-;c=getchar();}
while(c>=''&&c<='') {x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
struct node{int u,v;ll t,c;db w;}a[M];
ll n,m,f,fa[N];
int find(int x){if(x==fa[x])return x;return fa[x]=find(fa[x]);}
bool cmp(node x,node y){return x.w<y.w;}
bool ck(db x)
{
go(i,,m) a[i].w=a[i].c+a[i].t*x/1e7;
db ans=f+eps;//这里加eps是为了保证精度
//-----------------------------
sort(a+,a+m+,cmp);
go(i,,n) fa[i]=i;
go(i,,m)
{
int uf=find(a[i].u),vf=find(a[i].v);
if(uf==vf) continue;
fa[uf]=vf;
ans-=a[i].w;
if(ans<)return ;
}//---------------------------最小生成树
return ;
}
int main()
{
freopen("quake.in","r",stdin);
freopen("quake.out","w",stdout);
n=read();m=read();f=read();
db l=,r=inf;
go(i,,m) a[i].u=read(),a[i].v=read(),a[i].c=read(),a[i].t=read();
if(!ck()) {printf("0.0000");return ;}
while(l<r)
{
db mid=(l+r)/;
if(ck(mid+)) l=mid+;
else r=mid;
}
printf("%.4Lf",l/(db)1e7);
return ;
}

bzoj1816扑克牌

 #include<iostream>
#include<cstdio>
#define go(i,a,b) for(register int i=a;i<=b;i++)
#define ll long long
#define M 1000001
#define inf 1e12
using namespace std;
ll read()
{
ll x=,y=;char c=getchar();
while(c<''||c>'') {if(c=='-') y=-;c=getchar();}
while(c>=''&&c<='') {x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int n,m;
ll ct,c[M],l,r=inf;
bool ck(ll x)
{
ll nm=min(x,(ll)m);
go(i,,n){if(c[i]<x)nm=nm-(x-c[i]);if(nm<)return ;}
return ;
}
int main()
{
freopen("cards.in","r",stdin);
freopen("cards.out","w",stdout);
n=read();m=read();
go(i,,n) c[i]=read();
while(l<r)
{
ll mid=(l+r)>>;
if(ck(mid+)) l=mid+;
else r=mid;
}
printf("%lld",l);
return ;
}

洛谷3199最小圈

 #include<iostream>
#include<cstdio>
#define R register
#define go(i,a,b) for(R int i=a;i<=b;i++)
#define db long double
#define M 10001
#define N 3001
#define inf 1e10
#define eps 1e-10
using namespace std;
int rd()
{
int x=,y=;char c=getchar();
while(c<''||c>''){if(c=='-')y=-;c=getchar();}
while(c>=''&&c<=''){x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
int n,m,b[N],cnt;
bool in[N],flag;
db dis[N];
struct node{int v,nt;db w;}a[M];
void add(int u,int v,db w){a[++cnt].nt=b[u];a[cnt].v=v;a[cnt].w=w;b[u]=cnt;}
void ck(int u,db x)
{
in[u]=;
for(R int i=b[u];i;i=a[i].nt)
{
int v=a[i].v;db w=a[i].w;
if(dis[u]+w-x<dis[v])
{
if(in[v]||flag){flag=;return;}
dis[v]=dis[u]+w-x;
ck(v,x);
}
}
in[u]=;
}
int main()
{
n=rd();m=rd();
go(i,,m){int u=rd(),v=rd();db w;scanf("%Lf",&w);add(u,v,w);}
db l=-inf,r=inf;
while(r-l>eps)
{
db mid=(l+r)/;flag=;
go(i,,n){in[i]=;dis[i]=;}
go(i,,n){ck(i,mid);if(flag)break;}
if(flag) r=mid;
else l=mid;
}
printf("%.8Lf",l);
return ;
}