首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >求最小值和最大值

求最小值和最大值
EN

Code Review用户
提问于 2019-09-26 10:03:33
回答 1查看 81关注 0票数 1

我在做一个代码挑战问题:

卡班队长:国宝是一款流行的足球模拟游戏,可以在大多数智能手机上玩。在这个游戏中,你建立了一个由11人组成的团队,然后在故事模式或多人模式下进行竞争。你可能已经知道,一场足球比赛由11名球员组成,其中包括一名守门员和十名外场球员。

每个外场球员的能力在三个方面得分:攻击(运球,投篮,传球),防守(铲球,拦截,拦截)和身体(速度,力量,技术)。例如,A:4103 D:2837 P:3410的球员是典型的进攻球员(前锋位置),因为他的进攻(4103)比防守(2837)和身体(3410)高。另一方面,A:1546,D:5209,P:2708的球员是典型的防守球员,因为他的防守远高于他的进攻和体能。守门员有一个不同的衡量标准(节约和身体),但这不是我们关心的问题。

一个团队的实力仅仅是所有主要外场球员的能力得分之和。请注意,团队实力得分不考虑团队的平衡,例如,每名球员A:8000、D:1000、P:1000的10名队员比A:3000、D:3000、P: 3000的团队强;第一队的实力为100,000 (10 *(8,000+ 1000 + 1000)),第二组为90,000 (10 *(3,000+3,000))。

假设你有10名主要的外场球员和N名预备队队员。如果你最多可以替换1名主要的外场球员(有后备球员),你能获得的最大团队实力是多少?

输入

输入以整数开头:T (1≤T≤20),表示用例的数量。

每个大小写包含以下输入块:每个大小写以整数开头:N (1≤N≤10),表示后备玩家的数量。接下来的10行包含三个整数:Ai Di Pi (100≤AiDiPi≤20,000),代表第一主玩家的攻击、防御和物理得分。接下来的N行包含三个整数:Aj Dj Pj (100≤AjDjPj≤20,000),代表jth预备役球员的攻击、防御和物理得分。

输出

对于每一种情况,输出在一行“case #X: Y”中,其中X是大小写号(从1开始),Y是各自大小写的输出。

代码语言:javascript
复制
#include <iostream>

using namespace std;

int main () {
    const int totalOriginalPlayer {10};
    int testCases {};
    cin >> testCases;

    for (int i = 1; i <= testCases; i++) {
        int reserve {}, total {}, lowest {500000}, highest {};
        int attack {}, defense {}, physical {};
        cin >> reserve;

        int reservePlayers [reserve];
        int powerReservePlayers [reserve];

        int powerOriginalPlayers [totalOriginalPlayer];

        // Get power of all original players, calculate sum and find the minimum
        for (int i = 0; i < totalOriginalPlayer; i++) {
            cin >> attack >> defense >> physical;
            powerOriginalPlayers[i] = attack + defense + physical;
            total += powerOriginalPlayers[i];

            if (powerOriginalPlayers[i] < lowest) {
                lowest = powerOriginalPlayers[i];
            }
        }

       // Get power of all reserve players and find the maximum power
       for (int j = 0; j < reserve; j++) {
            cin >> attack >> defense >> physical;
            powerReservePlayers[j] = attack + defense + physical;

            if (powerReservePlayers[j] > highest) {
                highest = powerReservePlayers[j];
            }
       }

       // Subtract total with lowest and add highest
       if (lowest < highest) {
            total = total - lowest + highest;
       } else if (lowest >= highest) {
            total = total;
       }

       // Print out total
       cout << "Case #" << i << ": "<< total << endl;
    }
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2019-09-26 11:22:21

  • 不要做using namespace std;
  • 对范围使用适当的类型。测试用例的数量永远不可能是负的,所以我们应该使用无符号整数.看起来玩家的能力也同样没有签名。
  • for (int i = 1; i <= testCases; i++)在C++中,通常使用!=作为结束条件,并使用预增量运算符(因为我们不是临时值)。使用基于零的索引通常更安全,如果我们需要转换为基于一个的索引:for (int i = 0; i != testCases; ++i),只需添加一个用于打印的索引即可。
  • int attack {}, defense {}, physical {};。声明变量(特别是POD变量)尽可能接近使用点,以最小化它们的作用范围,并避免将它们用于多个事情。这些应该在每个最里面的循环中声明。
  • reserve不是常量值,因此这是无效的C++:int reservePlayers [reserve];,即使某些编译器允许它。我们应该使用std::vector代替。(这个特定的数组似乎也未使用!)
  • for (int i = 0; i < totalOriginalPlayer; i++)循环条件变量阴影外部循环的i变量。这可能会造成混乱。最好为循环变量选择一个有意义的名称,例如outfielderIndex
  • 将程序的逻辑与读取输入分开可能更整洁。然后,我们可以为两组播放器重用输入读取代码。std::vector外野手= ReadPlayerData(numOutfielders);std::vector后备队= ReadPlayerData(numReserves);std::uint32_t总计= // .std::uint32_t worstOutfielder = // .std::uint32_t bestReserve = // .do输出
  • 我们可以使用标准库来做必要的计算。特别是std::accumulatestd::min_elementstd::max_element
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/229691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档