[ABC294F] Sugar Water 2 题解
题目大意
高桥君有 瓶糖水,第 瓶有 克糖和 克水。青木君有 瓶糖水,第 瓶有 克糖和 克水。然后两人各拿出一瓶混在一起,求可能产生的第 大的浓度百分比是多少,误差在 内均为正确。
定义一瓶 克糖 克水的糖水浓度为 。
,,,输入均为整数。
题目解析
考虑直接求第 大不好算,所以考虑二分答案,然后求一个浓度比他大的数量。
考虑两个瓶糖水混合在一起,浓度大于等于 。
考虑化简,将 和 分到不等式两边,得到
这样我们可以按照 排序,枚举 二分 即可做到 计算。
加上前面二分答案,复杂度就是 ,其中 。
坑点:
long double
防止卡精度- 的范围是 ,需要
long long
int n,m; ll k; ld l,r,mid,p[maxn],q[maxn]; struct JTZ{ ld x,y; }a[maxn],b[maxn]; #define mg(i,j) ((a[i].x+b[j].x)*1.0/(a[i].x+a[i].y+b[j].x+b[j].y)) ll js(){ int i,le,ri,midd; ll cnt=0; for(i=1;i<=n;i++) p[i]=a[i].x-(a[i].x+a[i].y)*mid; for(i=1;i<=m;i++) q[i]=-b[i].x+(b[i].x+b[i].y)*mid; sort(q+1,q+m+1); for(i=1;i<=n;i++){ le=0,ri=m+1; while(le+1<ri){ midd=(le+ri)>>1; if(q[midd]<p[i]+1e-12) le=midd; else ri=midd; } cnt+=le; } return cnt; } int main(){ n=read(); m=read(); k=read(); int i; for(i=1;i<=n;i++) a[i].x=read(),a[i].y=read(); for(i=1;i<=m;i++) b[i].x=read(),b[i].y=read(); l=0,r=1; while(l+EPS<=r){ mid=(l+r)/2; if(js()<k) r=mid; else l=mid; } printf("%.10Lf",l*100.0); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具