题目:http://codeforces.com/contest/954/problem/E
题意:
n个水龙头,每个水龙头每秒最多出ai升温度为bi的水;
问求混合后温度为T的水最多多少升每秒。
分析:
按温度排序;
贪心如下:
左右两个指针l、r依次从温度为T的水龙头左右移动;
使之混合为T,某个水龙头的水量用完之后,指针左右移动;
直到l、r不能再移动为止。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int tmax=200005;
int n;
ll T;
double ans;
struct node{
double a;
ll t;
bool operator <(node y)const
{
return t<y.t;
}
};
node data[tmax];
int main()
{
cin>>n>>T;
int i,l=1,r=n;
for(i=1;i<=n;i++)
scanf("%lf",&data[i].a);
for(i=1;i<=n;i++)
scanf("%I64d",&data[i].t);
if(n==1)
{
if(data[1].t==T) printf("%.12lf",1.0*data[1].a);
else printf("0");
return 0;
}
sort(data+1,data+1+n);
for(i=2;i<=n;i++)
{
if(data[i].t>=T&&data[i-1].t<=T)
{
l=i-1;
r=i;
break;
}
}
if(data[l].t>T||data[r].t<T)
{
printf("0");
return 0;
}
while(l>=1)
{
if(data[l].t==T)
{
ans+=data[l].a;
l--;
}
else break;
}
while(r<=n)
{
if(data[r].t==T)
{
ans+=data[r].a;
r++;
}
else break;
}
while(l>=1&&r<=n)
{
if((1.0*(data[l].a*data[l].t+data[r].a*data[r].t))/(1.0*(data[l].a+data[r].a))>=1.0*T)
{
ans+=data[l].a+data[l].a*(1.0*T-1.0*data[l].t)/(1.0*(data[r].t-T));
data[r].a-=data[l].a*(1.0*T-1.0*data[l].t)/(1.0*(data[r].t-T));
l--;
}
else
{
ans+=data[r].a+data[r].a*(1.0*data[r].t-1.0*T)/(1.0*(T-data[l].t));
data[l].a-=data[r].a*(1.0*data[r].t-1.0*T)/(1.0*(T-data[l].t));
r++;
}
}
printf("%.12lf",ans);
return 0;
}