【问题标题】:Minimal amount of points needed to get grade "x" (C++) (explained)获得等级“x”(C++)所需的最低分数(解释)
【发布时间】:2013-03-01 15:20:10
【问题描述】:

我正在在线进行 C++ 挑战,我被困在这部分。

基本上,挑战如下。

“Derp 是一所大学的学生。他最喜欢的课是数学。年底快到了,Derp 问自己,他需要在最后一次考试中获得多少分才能获得“K”级。

老师今年考了5次,最高100分。

If <=60 = Grade : 1
If >=60 && <= 69 = Grade : 2
If >=70 && <= 79 = Grade : 3
If >=80 && <= 89 = Grade : 4
If >=90 && <= 100 = Grade: 5

如果你得到 89.8 分,你将获得 4 级,而不是 5 级。我们知道他的前四项测试的结果 - T1、T2、T3、T4。我们必须找出 Derp 在最后一次测试中需要多少最低分才能获得他想要的“K”级。

输入: 在输入中,我们首先通过 Derp "K" (2

输出: 我们必须输出 Derp 在他最后一次考试中获得的最低分数,以便在数学中获得他想要的“K”级。如果 Derp 没有机会获得“K”级,即使他的最后一次测试有最高分,我们必须输出“Impossible”。”

例子:

输入: 5 100 100 100 100

输出: 50

输入: 5 10 20 30 40

输出: 不可能

输入: 2 100 100 100 100

输出: 0

输入: 4 83 74 79 73

输出: 91

这是我目前得到的。

#include <iostream>

using namespace std;

int main()
{
    int grade;
    cin >> grade;
    int t1,t2,t3,t4;
    cin >> t1 >> t2 >> t3 >> t4;
    if((t1+t2+t3+t4)/4<=59)
    {
        cout << "Grade: 1\n";
    }
    else if((t1+t2+t3+t4)/4>=60 && (t1+t2+t3+t4)/4<=69)
    {
        cout << "Grade: 2\n";
    }
    else if((t1+t2+t3+t4)/4>=70 && (t1+t2+t3+t4)/4<=79)
    {
        cout << "Grade: 3\n";
    }
    else if((t1+t2+t3+t4)/4>=80 && (t1+t2+t3+t4)/4<=89)
    {
        cout << "Grade: 4\n";
    }
    else if((t1+t2+t3+t4)/4>=90 && (t1+t2+t3+t4)/4<=100)
    {
        cout << "Grade: 5\n";
    }
    int t5;
    return 0;
}

我也做了一些数学运算,得出了这个结论。

(100+100+100+100+x)/5>=90

(400+x)/5>=90

80+x/5 >= 90

x/5 >= 10

x >= 50

这基本上是上面的第一个示例输入/输出,以数学方式。我不确定我将如何编码。欢迎任何想法!

谢谢。

【问题讨论】:

  • 你知道函数怎么写吗?
  • 我在这里看到了一些重复。如果复制粘贴,最好引入variablefunctionclass 来封装它。
  • 我确实知道如何编写函数,但我并没有真正用过很多。我解决的大多数任务都不需要创建函数..
  • 不确定如何编写代码?您应该将您的问题限制在您面临的特定问题上,而不是仅仅将整个作业转储到 SO 上。 (基本上,只需忽略作业的部分和您已经工作的代码,专注于问题的本质。)
  • 我的问题是如何在 C++ 中编写“数学”部分。我已经知道如何使用数学手动完成,但不是在 C++ 中。

标签: c++


【解决方案1】:

关键是您必须使用所需的平均点数来计算结果。基本上,如果获得 5、4、3 和 2 所需的平均分分别为 90、80、70 和 60,那么五项测试的分数之和为 450、400、350 和 300。如果Derp需要的分数减去他目前的分数超过100分,那么不可能得到更好的分数。实际的实现可能如下所示:

int main()
{
    int mark;
    int t1, t2, t3, t4;

    std::cin >> mark >> t1 >> t2 >> t3 >> t4;
    int total = t1 + t2 + t3 + t4;
    int total_needed = 5 * (60 + (mark - 2) * 10);
    int diff = total_needed - total;

    if (diff > 100) {
    std::cout << "Impossible" << std::endl;
    } else if (diff <= 0) {
        std::cout << "You have already got enough points" << std::endl;
    } else {
        std::cout << diff << " points needed yet" << std::endl;
    }

    return 0;
}

【讨论】:

  • 你确定这是正确的,因为例如,如果你输入“5 10 20 30 40”它输出需要-10分,这是不可能的?
  • 使用最新版本的代码后,它会输出“5 10 20 30 40”的 Impossible,但输入“2 100 100 100 100”会输出 -100。这是错误的,应该是 0.. 我似乎无法理解这是如何完成的。
  • @JohnSmith 这一切都取决于你如何解释它......如果结果是负值,则意味着 Derp 已经拥有获得该标记所需的点数。但如果你愿意,我可以附上一张支票。
  • #include &lt;iostream&gt; int main() { int mark; int t1, t2, t3, t4; std::cin &gt;&gt; mark &gt;&gt; t1 &gt;&gt; t2 &gt;&gt; t3 &gt;&gt; t4; int total = t1 + t2 + t3 + t4; int total_needed = (60 + (mark - 2) * 10) * 5; if (total_needed - total &gt; 100) { std::cout &lt;&lt; "Impossible" &lt;&lt; std::endl; } else if(total_needed - total &lt; 0) { std::cout &lt;&lt; "Impossible" &lt;&lt; std::endl; } else { std::cout &lt;&lt; total_needed - total &lt;&lt; " points needed yet" &lt;&lt; std::endl; } }这个?
  • 好吧,stackoverflow 不允许在 cmets 中使用多行,我基本上是这样做的:else if(total_needed - total &lt; 0) { std::cout &lt;&lt; "Impossible" &lt;&lt; std::endl; },它似乎工作得很好!感谢您的帮助。
【解决方案2】:

(t1 + t2 + t3 + t4 + t5)/5 = K
其中 K 等于给定 K 范围内的最小数。(如果为 3,则 K = 70)

求解 t5:

t5 = 5k - t1 - t2 - t3 - t4

如果 t5

【讨论】:

    猜你喜欢
    • 2021-12-23
    • 1970-01-01
    • 2010-10-13
    • 2013-04-27
    • 2014-06-01
    • 2021-09-08
    • 2020-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多