1072:鸡尾酒疗法

1072:鸡尾酒疗法

时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】

鸡尾酒疗法,指“高效抗逆转录病毒治疗”。人们在鸡尾酒疗法的基础上又提出了很多种改进的疗法。为了验证这些治疗方法是否在疗效上比鸡尾酒疗法更好,可用通过临床对照实验的方式进行。假设鸡尾酒疗法的有效率为x,新疗法的有效率为y,如果y-x大于5%,则效果更好,如果x-y大于5%,则效果更差,否则称为效果差不多。下面给出n组临床对照实验,其中第一组采用鸡尾酒疗法,其他n-1组为各种不同的改进疗法。请写程序判定各种改进疗法效果如何。

【输入】

第一行为整数n(1<n≤20);其余n行每行两个整数,第一个整数是临床实验的总病例数(小于等于10000),第二个疗效有效的病例数。这n行数据中,第一行为鸡尾酒疗法的数据,其余各行为各种改进疗法的数据。

【输出】

有n-1行输出,分别表示对应改进疗法的效果:如果效果更好,输出better;如果效果更差,输出worse;否则输出same。

【输入样例】

5

125 99

112 89

145 99

99 97

123 98

【输出样例】

same

worse

better

same

重难点:

本题是使用新疗法与鸡尾酒疗法进行比较,而它们的类型都为浮点型。在之前的题解中曾多次提到:浮点型的比较,应注意精度问题。可以参考题解:【题解】1058:求一元二次方程,在此不再讨论精度误差问题。如果经过精度误差处理后还是不正确,可能与官方的测试数据有关。因为,如果官方按照错误的答案设计测试数据,那么就算写出正确的答案,也不能通过。

当然,通过测试,就算不考虑精度问题也能通过。但应严谨对待问题,尤其是在比赛时,题目都是通过精心设计的,否则很可能就会丢分了。

在上述《思路分析》中讲到,输入一组新疗法数据,接着是输出该组与鸡尾酒比较的结果,而不是继续输入。即输入->输出->输入->输出…

如此的话,不是错了吗?不是的,我们提交代码后,后台会评判我们的代码,其中输入的数据和输出的数据分别存储在两个文件中。说明后台的评判系统,从输入文件中读取数据,经过代码测试后,将该输出数据与输出文件对应的数据进行对比,如果一致则正确,否则为错误。

求解过程:

声明5个int类型变量n、x1、x2、y1、y2,n表示有n组数据,x1表示鸡尾酒总病例数,x2表示鸡尾酒有效病例数,y1表示新疗法总病例数,y2表示新疗法有效病例数。

输入3个整数分别给变量n、x1、x2。

声明2个double类型变量x和y,并把1.0 * x2 / x1的结果赋给x。其中x表示鸡尾酒有效率,y表示新疗法有效率。

循环从2开始,到n结束,循环体中:

1.输入2个整数分别给变量y1和y2。

2.把1.0 * y2 / y1的结果赋给y。

3.如果y - x > 0.05,则输出"better"并换行。

4.否则,如果x - y > 0.05,则输出"worse"并换行。

5.否则,输出"same"并换行。

6.i++。

参考代码 - C++:

题目中的5%,其实就是0.05。注意输出数据中,是一个结果一行,所以每输出一个结果记得要输出换行。当然,因为循环一次输出一个结果,也可以在最后才输出换行。

// 不考虑精度误差

#include <iostream>
using namespace std;
int main()
{
    int n, x1, x2, y1, y2;
    cin >> n >> x1 >> x2;
    double x = 1.0 * x2 / x1, y;
    for (int i = 2; i <= n; i++)
    {
        cin >> y1 >> y2;
        y = 1.0 * y2 / y1;
        if (y - x > 0.05) cout << "better" << endl;
        else if (x - y > 0.05) cout << "worse" << endl;
        else cout << "same" << endl;
    }
    return 0;
}

参考代码 - C语言:

// 不考虑精度误差

#include <stdio.h>
int main()
{
    int n, x1, x2, y1, y2, i;
    scanf("%d %d %d", &n, &x1, &x2);
    double x = 1.0 * x2 / x1, y;
    for (i = 1; i < n; i++)
    {
        scanf("%d %d", &y1, &y2);
        y = 1.0 * y2 / y1;
        if (y - x > 0.05) printf("better\n");
        else if (x - y > 0.05) printf("worse\n");
        else printf("same\n");
    }
    return 0;
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值