Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water
Posted winfor
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water相关的知识,希望对你有一定的参考价值。
题意:给一个杯子 可以倒热水h 和冷水c 必须热冷热冷这样倒,可以倒无限次
问至少倒多少次的时候 温度的总和/倒的次数 最接近给的温度t
题目链接:https://codeforces.ml/contest/1359/problem/C
思路:设出函数考虑单调性 再考虑二分
1 假设倒了x杯热水的时候,冷水也倒了x杯
那么f(x)=(c*x+h*x)/(2*x) 则f(x)=(c+h)/2
所以倒了倒了偶数次的时候温度恒为 (c+h)/2
2.假设冷水倒了x-1杯的时候
那么f(x)=(c*(x-1)+h*x)(x*2-1) 运用求导知识 可以得 导函数为 (c-h)/(2*x-1)^2 可知恒小于0
所以单调递减 把1和正无穷带入函数 可知值域为((c+h)/2,h]
那么就可以利用二分 找到第一个小于t的x
然后再比较一下最后一个大于t的数 也就是x-1 两者谁更接近t
不要忘记此时的答案是x 那么总的次数即为 x+x-1 或者是 x-1 +(x-1)-1
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define pb push_back 5 const int maxn=2e5+5; 6 const int mod=1e9+7; 7 double h,c,t; 8 double check(double x) 9 { 10 return (c*(x-1)+h*x)/(2*x-1); 11 } 12 13 int main() 14 { 15 ios::sync_with_stdio(false); 16 cin.tie(0); 17 int q; 18 cin>>q; 19 while(q--) 20 { 21 cin>>h>>c>>t; 22 if(t<=(c+h)/2) 23 { 24 cout<<2<<‘ ‘; 25 } 26 else 27 { 28 int l=1,r=1e9; 29 int ans=1; 30 while(l<=r) 31 { 32 int mid=(l+r)/2; 33 if(check(mid)>t) 34 { 35 l=mid+1; 36 } 37 else 38 { 39 ans=mid; 40 r=mid-1; 41 } 42 } 43 if(abs(t-check(ans-1))<=abs(t-check(ans))) 44 { 45 cout<<2*(ans-1)-1<<‘ ‘; 46 } 47 else 48 cout<<2*ans-1<<‘ ‘; 49 50 } 51 } 52 53 }
以上是关于Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water的主要内容,如果未能解决你的问题,请参考以下文章
Educational Codeforces Round 7 A
Educational Codeforces Round 7
Educational Codeforces Round 90
Educational Codeforces Round 33