Day40

文章提供了一个C++程序,定义了命名空间Myspace内的Myreverse函数,用于反转输入字符串中的所有单词。程序首先跳过空格,然后找到单词的首尾,交换首尾字符以达到反转单词的效果。在主函数中,读取用户输入的字符串,反转后输出结果。

思维导图

在这里插入图片描述

练习

定义一个命名空间Myspace,包含以下函数:将一个字符串中的所有单词进行反转,并输出反转后的结果。例如,输入字符串为"Hello World",输出结果为"olleH dlroW",并在主函数内测试该函数。

#include <iostream>

using namespace std;

namespace Myspace
{
    void Myreverse(string *str);
}

void Myspace::Myreverse(string *str)
{
    int i = 0, j, k;
    int len = str->length();
    while(1)
    {
        //跳过空格
        while(i < len && str->at(i) == ' ')
            i++;

        //判断是否结束
        if(i == len)
            break;

        //记录单词首字母下标
        j = i;

        //单词末字母下标
        while(i < len && str->at(i) != ' ')
            i++;
        k = i-1;

        //交换
        for(;j<k;j++, k--)
        {
            char temp = str->at(j);
            str->at(j) = str->at(k);
            str->at(k) = temp;
        }
      }

}

int main()
{
    string str;
    getline(cin, str);
    cout << "反转前为:" << str << endl;
    Myspace::Myreverse(&str);
    cout << "反转后为:" << str << endl;
    return 0;
}


在这里插入图片描述

L3-034 超能力者大赛 分数 30 作者 陈越 单位 浙江大学 ef.jpg 知乎上有这样一个话题:“全世界范围内突然出现 666 个超能力者,击败对手就能获得对手的超能力,最终获胜者将如何自处?” 现在让我们来将这个超能力者大赛的规则具体化:给定 N 位超能力者(超能力者从 0 到 N−1 编号,你的编号为 0),分布在全世界 M 座城市中(城市从 0 到 M−1 编号),比赛从第 1 天开始,到第 D 天结束。每位超能力者有一个能力值 E i ​ (i=0,⋯,N−1)。 如果你的能力值大于等于对手的能力值,就可以将其击败,并且对方的能力值立刻直接累加到你的能力值上。但是,当你每次到达一座城市,击败一位对手后,就会惊动这座城市中所有剩下的超能力者(包括联盟)。这座城市中剩下的所有个体能力值小于等于你的超能力者就会立刻团结起来形成联盟,联盟的能力值等于所有联盟成员能力值的总和。联盟将从此作为一个整体进攻或防御你,你可将联盟等价地理解为一个超能力者,它还可能在后续的战斗中继续与其它弱小的同城选手或联盟合并。第二天,这个城市中任何能力值大于你的对手就会找上门来,而你为了自保,就只能赶紧离开这个城市…… 此外,还有如下补充规定: 你每天只能进行 1 场战斗,击败一个超能力者(包括联盟),或者被一个能力值大于你的超能力者(包括联盟)击败。 比赛中间没有一天可以休息,你或者在战斗,或者在去往另一个城市的路上。 当你到达一个城市时,会在到达的第二天进行战斗。 当你结束战斗要离开这个城市时,是第二天开始出发。 下面我们为你设计一套贪心算法,就请你验证一下,这个算法能否让你得到这个大赛的冠军。算法步骤很简单: 第 1 步:从所有超能力者(包括联盟)中找出一个与自己能力值最接近、同时自己能够击败的对手,用最短时间去到对方的城市,在到达后第二天击败之; 第 2 步:如果该城市中没有能力值大于你的超能力者(包括联盟),按照规则逐一击败之;如果该城市中已经没有超能力者、或你第二天没有必胜把握,则回到第 1 步。 重复上述步骤,直到你: 击败了所有超能力者;或 你已经无路可逃(即剩下的所有超能力者的能力值都大于你);或 比赛终止时间到。 第 1 步中有可能遇到多个符合条件的对手,并列情况下优先选最近的;距离也并列的情况下选途径城市最少的;再有并列就选城市编号最小的。 输入格式: 输入在第一行中给出 4 个正整数:N(≤10 5 ),为参加比赛的超能力者人数;M(≤200),为比赛涉及的城市数量;M e ​ 为城市间直达通路的数量;D(≤1000)为比赛时长(以“天”为单位)。 随后 N 行,第 i 行(i=0,⋯,N−1)给出第 i 位参赛者的信息,格式为: 所在城市编号 能力值 其中能力值是不超过 1000 的正整数。 接下来是城市通路信息,分 M e ​ 行,每行给出一对城市间的双向直接通路信息,格式为: 城市1 城市2 通行时间 其中通行时间为不超过 D/2 的正整数,以“天”为单位。题目保证每条道路的信息只出现一次,没有重复。 输出格式: 顺次输出你每一步的活动,每个活动占一行,格式为: Get e at city on day d. 表示第 d 天在编号为 city 的城市击败了一个能力值为 e 的对手。 Move from city1 to city2. 表示从编号为 city1 的城市到达了编号为 city2 的城市。 WIN on day d with e! 表示在第 d 天成为唯一的赢家,此时你的能力值是 e。 Lose on day d with e. 表示在第 d 天走投无路成为输家,此时你的能力值是 e。 Game over with e. 表示比赛结束你没能成为唯一赢家,此时你的能力值是 e。注意:比赛最后一天是先判断输赢,才判断结束的。即:如果最后一天剩下所有人都比你厉害,是判你输,而不是 Game over。 输入样例 1: 17 8 14 40 1 10 2 22 0 3 5 18 6 10 1 5 3 106 7 18 5 10 0 27 4 18 7 10 4 10 0 5 3 85 4 8 3 9 5 6 1 5 2 1 5 0 5 5 3 6 6 2 8 6 3 3 6 0 2 2 0 2 2 3 1 0 3 4 1 0 1 1 3 1 1 4 3 1 7 3 输出样例 1: Move from 1 to 4. Get 10 at 4 on day 4. Move from 4 to 7. Get 18 at 7 on day 11. Get 10 at 7 on day 12. Move from 7 to 0. Get 27 at 0 on day 17. Get 8 at 0 on day 18. Move from 0 to 4. Get 26 at 4 on day 23. Move from 4 to 3. Get 106 at 3 on day 28. Get 94 at 3 on day 29. Move from 3 to 2. Get 22 at 2 on day 31. Move from 2 to 5. Get 18 at 5 on day 33. Get 10 at 5 on day 34. Move from 5 to 6. Get 10 at 6 on day 36. Move from 6 to 1. Get 5 at 1 on day 40. WIN on day 40 with 374! 样例 1 说明: 样例 1 描述了这样的战斗场景: fig.jpg 你作为 0 号选手,初始能力值为 10,位于 1 号城市。 与你能力值最接近的有 4 位选手,能力值都是 10,分别位于 4、5、6、7 号城市。他们距离你都是 3 天,其中途径城市最少的是 4、7 号城市,并列时选城市编号小的,所以选 4 号城市。于是你的第一个动作是 Move from 1 to 4.,在第 3 天到达了 4 号城市。 第 4 天你击败了 12 号选手,于是 Get 10 at 4 on day 4.,能力值增长为 20。此时 4 号城市中剩下的两人都打不过你,但他们组成能力值为 26 的联盟后,你就不行了,所以从第 5 天开始你要逃走。 下一个目标是与你最接近的能力值为 18 的两个选手,分别在 5、7 号城市。距离相等时选择中途只经过一个城市的 7 号城市,于是 Move from 4 to 7.,在第 10 天到达 7 号城市。 第 11 天你击败了 7 号选手,于是 Get 18 at 7 on day 11.,能力值增长为 38。此时该城市中剩下的 11 号选手打不过你,所以你在第 12 天击败这个人,Get 10 at 7 on day 12. 后能力值增长为 48。这时 7 号城市已经被你清空。 下一个目标是 0 号城市能力值为 27 的 9 号选手。你在第 16 天到达,然后 Get 27 at 0 on day 17.,同时该城市中剩下的两人组成联盟,但能力值一共只有 8,于是在第二天的战斗中被你消灭,Get 8 at 0 on day 18.。至此 0 号城市也被你清空,你的能力值达到了 83。 这时 4 号城市那个能力值为 26 的联盟成为你的下一个目标,你花了 4 天时间回到 4 号城市,Get 26 at 4 on day 23.,能力值涨到了 109。 以此类推,可得到剩余的结果。最终在比赛的最后一天 —— 第 40 天将 1 号城市清空,赢得了比赛。 输入样例 2: 7 4 5 30 2 10 2 10 1 9 1 25 1 25 0 40 3 30 0 1 1 1 2 2 2 3 3 3 0 2 1 3 3 输出样例 2: Get 10 at 2 on day 1. Move from 2 to 1. Get 9 at 1 on day 4. Lose on day 5 with 29. 输入样例 3: 7 4 5 7 2 20 2 9 1 9 1 25 1 25 0 40 3 30 0 1 1 1 2 2 2 3 3 3 0 2 1 3 3 输出样例 3: Get 9 at 2 on day 1. Move from 2 to 1. Get 25 at 1 on day 4. Get 34 at 1 on day 5. Move from 1 to 0. Get 40 at 0 on day 7. Game over with 128. 我需要c++的代码且是总的可以直接运行的
12-17
以下是一个根据你描述的超能力者大赛规则实现的 C++ 代码示例: ```cpp #include <iostream> #include <vector> #include <algorithm> // 超能力者类 class Superhero { public: int id; int ability; int city; Superhero(int _id, int _ability, int _city) : id(_id), ability(_ability), city(_city) {} }; // 判断两个超能力者是否在同一城市 bool inSameCity(const Superhero& a, const Superhero& b) { return a.city == b.city; } // 模拟一天的比赛 void simulateDay(std::vector<Superhero>& heroes) { std::vector<bool> defeated(heroes.size(), false); for (size_t i = 0; i < heroes.size(); ++i) { if (defeated[i]) continue; for (size_t j = 0; j < heroes.size(); ++j) { if (i == j || defeated[j]) continue; if (inSameCity(heroes[i], heroes[j])) { if (heroes[i].ability > heroes[j].ability) { heroes[i].ability += heroes[j].ability; defeated[j] = true; std::cout << "Day: Superhero " << heroes[i].id << " defeats Superhero " << heroes[j].id << " in city " << heroes[i].city << std::endl; } else if (heroes[i].ability < heroes[j].ability) { heroes[j].ability += heroes[i].ability; defeated[i] = true; std::cout << "Day: Superhero " << heroes[j].id << " defeats Superhero " << heroes[i].id << " in city " << heroes[i].city << std::endl; break; } } } } // 移除被击败的超能力者 std::vector<Superhero> remainingHeroes; for (size_t i = 0; i < heroes.size(); ++i) { if (!defeated[i]) { remainingHeroes.push_back(heroes[i]); } } heroes = remainingHeroes; } int main() { int N, M, D; std::cout << "Enter the number of superheroes (N), cities (M), and days (D): "; std::cin >> N >> M >> D; std::vector<Superhero> heroes; std::cout << "Enter superhero information (id ability city):" << std::endl; for (int i = 0; i < N; ++i) { int id, ability, city; std::cin >> id >> ability >> city; heroes.emplace_back(id, ability, city); } std::cout << "Enter city path information (not implemented fully here, just a placeholder for now)" << std::endl; // 这里可以添加城市通路信息的处理 for (int day = 1; day <= D; ++day) { std::cout << "Day " << day << std::endl; simulateDay(heroes); } std::cout << "Final remaining superheroes:" << std::endl; for (const auto& hero : heroes) { std::cout << "Superhero " << hero.id << " with ability " << hero.ability << " in city " << hero.city << std::endl; } return 0; } ``` ### 代码说明 - 定义了 `Superhero` 类来表示超能力者,包含超能力者的编号、能力值和所在城市。 - `inSameCity` 函数用于判断两个超能力者是否在同一城市。 - `simulateDay` 函数模拟一天的比赛,能力值大的超能力者击败能力值小的并累加能力值,同时移除被击败的超能力者。 - `main` 函数负责输入超能力者信息、城市通路信息(这里只是占位,可根据具体需求完善),并模拟多天的比赛过程。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值