鸡尾酒疗法

GitHub跳转原题关系图返回列表

比较改进疗法与基准疗法有效率之差是否严格超过 5%。

OJ: noi_openjudge

题目 ID: ch0105-18

难度:入门

标签:模拟浮点数python

日期: 2026-07-30 23:01

题意

第一组是基准疗法,比较每个新疗法的有效率差,严格大于 5% 为 better,严格小于 -5% 为 worse

思路

不要直接比较浮点有效率,5% 边界会受二进制误差影响。将差值通分:effective * base_total - base_effective * total,再交叉相乘比较它是否严格超过分母的 5%。等于 5% 时仍为 same

代码

Python代码

python
experiment_count = int(input())
base_total, base_effective = map(int, input().split())

for _ in range(experiment_count - 1):
    total, effective = map(int, input().split())
    difference_numerator = effective * base_total - base_effective * total
    denominator = total * base_total
    if difference_numerator * 100 > denominator * 5:
        print("better")
    elif difference_numerator * 100 < -denominator * 5:
        print("worse")
    else:
        print("same")

C++代码

cpp
#include <cstdio>

int main(){
    int n;
    int a,b;
    scanf("%d",&n);
    scanf("%d%d",&a,&b);
    double rate_1 = b*1.0/a;
    int i;
    for (i=1;i<n;i++){
        scanf("%d %d",&a,&b);
        double rate_2 = b*1.0 / a;
        if( rate_1 - rate_2 > 0.05)
            printf("worse\n");
        else if ( rate_2 - rate_1 > 0.05)
            printf("better\n");
        else
            printf("same\n");
    }
    return 0;
}

复杂度

时间复杂度为 O(n)O(n),额外空间复杂度为 O(1)O(1)

总结

比较比例变化时应直接比较差值,并严格区分“大于阈值”和“等于阈值”。