C. Mixing Water

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";
    }
}
posted @ 2024-05-01 10:53  _Yxc  阅读(6)  评论(0编辑  收藏  举报