https://codeforces.com/contest/1359/problem/C
题意:给h和c两个数,并且操作顺序必须是hchchchch...对这些操作求和后除以操作次数得到均值,要求这个均值尽可能的接近t。问在最接近t的情况下,最少需要进行多少次操作。
思路:如果(h + c) / 2 >= t,那么则只需两次操作最优。 如果h == t,那么一次操作最优。对于其他的情况,可以假设hc这样的操作有k次,可以得到公式k = (t - h) / (h + c - 2 * t).k是一个浮点数,那么再讨论一下k向上或者向下取整的情况,取一个最优的即可。
总结:一开始误解了题意,以为题目要求任意顺序,只要最后的值最接近t就行。后来发现有顺序要求,那么就分三种情况讨论。对于第三种情况,没有考虑到设一个k,然后求k即可。
如果不要求操作顺序的话,那么设一个未知数k是无效的,需要两个未知数x和y来表示,那么不能O(1)求x和y,可能需要枚举x和y的数量,根据一个x,可以求出固定的y?
void solve(){
double h, c, t;
cin >> h >> c >> t;
if (t == h){
cout << 1 << "\n";
}
else if ((h + c) >= t * 2){
cout << 2 << "\n";
}
else{
double k = (t - h) / (h + c - 2 * t);
double error1 = abs((ceil(k) * (h + c) + h) / (ceil(k) * 2 + 1) - t);
double error2 = abs((floor(k) * (h + c) + h) / (floor(k) * 2 + 1) - t);
cout << (error2 <= error1 ? (2 * floor(k) + 1) : (2 * ceil(k) + 1)) << "\n";
}
}
标签:顺序,题意,Water,那么,Mixing,操作,最优,cout
From: https://www.cnblogs.com/yxcblogs/p/18169090