您的位置:首页 > 其它

bzoj1492 [NOI2007]货币兑换Cash

2016-05-24 19:46 211 查看
传送门:[Submit]

本来写了一个详细的题解。。。。。。。。

但是TM博客园不保存。。。。。。

于是我就直接复制论文了吧。。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<cmath>
#define eps 1e-9
#define inf 0x7fffffff
#define ll long long
#define N 100005
using namespace std;
struct data{double a,b,rate,k,x,y; int id;
}q
,t
;
double f
;
int s
;
int n;
bool cmp(data a, data b){ return a.k>b.k;
}
double getk(int a,int b)
{
if(!b)return -1e20;
if(fabs(q[a].x-q[b].x)<eps)return 1e20;
return (q[b].y-q[a].y)/(q[b].x-q[a].x);
}
void solve(int l,int r)
{
if (l==r)
{
f[l]=max(f[l],f[l-1]);
q[l].y=f[l]/(q[l].b+q[l].rate*q[l].a);
q[l].x=q[l].rate*q[l].y;
return;
}
int mid=(l+r)>>1,l1=l,l2=mid+1;
for (int i=l; i<=r; i++)
if (q[i].id<=mid) t[l1++]=q[i]; else t[l2++]=q[i];
for (int i=l; i<=r; i++) q[i]=t[i];
solve(l,mid);
int top=0;
for (int i=l; i<=mid; i++)
{
while (top>1 && getk(s[top-1],s[top]) < getk(s[top-1],i)+eps)top--;
s[++top]=i;
}
s[++top]=0;
int j=1;
for (int i=mid+1; i<=r; i++)
{
while (j<top && getk(s[j],s[j+1])+eps > q[i].k) j++;
f[q[i].id]=max(f[q[i].id],q[s[j]].x*q[i].a+q[s[j]].y*q[i].b);
}
solve(mid+1,r);
l1=l;l2=mid+1;
for (int i=l; i<=r; i++)
if ((q[l1].x<q[l2].x || l2>r) && l1<=mid) t[i]=q[l1++]; else t[i]=q[l2++];
for (int i=l; i<=r; i++) q[i]=t[i];
}
int main()
{
scanf("%d%lf",&n,&f[0]);
for (int i=1; i<=n; i++)
{
scanf("%lf%lf%lf",&q[i].a,&q[i].b,&q[i].rate);
q[i].k=-q[i].a/q[i].b; q[i].id=i;
}
sort(q+1,q+1+n,cmp);
solve(1,n);
printf("%0.3lf",f
);
}


View Code
日常一膜:CYS,CYY,LS,YZW,YWF,OYZX..............
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: