鱼C论坛

 找回密码
 立即注册
查看: 1103|回复: 11

[已解决]超级闪光牛可乐

[复制链接]
发表于 2024-3-8 19:45:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
森林中出现了野生的超级闪光牛可乐!想要捕捉它,你至少需要投喂r点诱惑力的食物。幸运的是,清楚姐姐在知道了这件事后,非常大气的为你开放了她的豪华零食仓库-
仓库里有n种不同名称的食物,第i种食物能提供wi点的诱惑力。当你所投喂食物的诱惑力之和不小于x时,就可以顺利的捕捉到它。
现在,你可以从仓库中取走一些食物了,不管怎么说,今天的目标只有一个,那就是拿下超级闪光牛可乐!

输入描述:

每个测试文件仅有一组测试数据。
第一行输入一个整数 x(1≤x≤1000)表示至少需要多少诱惑力的食物才能捕捉这一只超级闪光牛可乐。
第二行输入一个整数 n(1≤n≤26)表示清楚姐姐豪华零食仓库中的零食种类数量。
随后 n 行,每行输入一个小写字母 ch 和一个整数 w ('a'≤ch≤'z',1≤w≤500),表示第i 种零食的名称以及提供的诱惑力。保证零食的名称不重复;使用
单个空格间隔。

输出描述:

你需要在一行上输出一个由小写字母组成的答案字符串,代表你要喂给超级闪光牛可乐的食物。但是请注意,喂食的零食数量不能超过1000个,否则牛可乐会因为吃
不下而直接离开。清楚姐姐仓库中没有的零食种类提供的诱惑力会被视为0。
如果无法捕获牛可乐,仅需输出一行-1。
没思路
最佳答案
2024-3-8 19:47:24
亿壹粟 发表于 2024-03-08 19:47
能用c++完整写出吗


当然可以!下面是用 C++ 完整实现的代码:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. struct Food {
  5.     char name;
  6.     int tempt;
  7. };

  8. int main() {
  9.     int x, n;
  10.     cin >> x >> n;

  11.     vector<Food> foods(n);
  12.     for (int i = 0; i < n; i++) {
  13.         cin >> foods[i].name >> foods[i].tempt;
  14.     }

  15.     vector<vector<int>> dp(n + 1, vector<int>(x + 1, 1001)); // 初始化 dp 数组
  16.     dp[0][0] = 0;

  17.     for (int i = 1; i <= n; i++) {
  18.         dp[i][0] = 0;
  19.         for (int j = 1; j <= x; j++) {
  20.             dp[i][j] = dp[i - 1][j];
  21.             if (j >= foods[i - 1].tempt) {
  22.                 dp[i][j] = min(dp[i][j], dp[i - 1][j - foods[i - 1].tempt] + 1);
  23.             }
  24.         }
  25.     }

  26.     if (dp[n][x] > 1000) { // 无法捕获牛可乐
  27.         cout << -1 << endl;
  28.     } else {
  29.         string ans;
  30.         int i = n, j = x;
  31.         while (i > 0 && j > 0) {
  32.             if (dp[i][j] == dp[i - 1][j]) { // 没有取这个食物
  33.                 i--;
  34.             } else { // 取了这个食物
  35.                 ans = foods[i - 1].name + ans;
  36.                 j -= foods[i - 1].tempt;
  37.             }
  38.         }
  39.         cout << ans << endl;
  40.     }

  41.     return 0;
  42. }
复制代码


希望这段代码能够帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-3-8 19:45:41 | 显示全部楼层
没关系,让我来帮你思考一下解决办法。这个问题可以使用动态规划来解决。

首先,我们需要定义一个二维数组dp,其中dp[i][j]表示在前i个食物中选择,总诱惑力为j时,能够捕捉到超级闪光牛可乐所需要的最少食物数量。

接下来,我们需要遍历每一个食物,对于每一个食物,我们有两种选择:要么选择不取这个食物,要么选择取这个食物。

如果选择不取这个食物(即不投喂这个食物),那么dp[i][j] = dp[i-1][j]。

如果选择取这个食物(即投喂这个食物),那么dp[i][j] = dp[i-1][j-wi] + 1,其中wi表示第i种食物的诱惑力。

我们需要选择上述两种情况中较小的一个,作为dp[i][j]的值。最后,我们只需要输出dp[n][x]即可。

下面是完整的代码实现:

  1. x = int(input())  # 需要的诱惑力
  2. n = int(input())  # 零食种类数量

  3. dp = [[0] * (x+1) for _ in range(n+1)]  # 初始化dp数组

  4. for i in range(1, n+1):
  5.     ch, w = input().split()
  6.     w = int(w)
  7.    
  8.     for j in range(1, x+1):
  9.         dp[i][j] = dp[i-1][j]  # 不取这个食物
  10.         
  11.         if j >= w:
  12.             dp[i][j] = min(dp[i][j], dp[i-1][j-w] + 1)  # 取这个食物

  13. if dp[n][x] == 0 or dp[n][x] > 1000:
  14.     print(-1)
  15. else:
  16.     ans = ''
  17.     i, j = n, x
  18.     while i > 0 and j > 0:
  19.         if dp[i][j] == dp[i-1][j]:  # 没有取这个食物
  20.             i -= 1
  21.         else:  # 取了这个食物
  22.             ans = ch + ans
  23.             j -= w
  24.    
  25.     print(ans)
复制代码


希望这个解决办法能够帮到你!如果有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-8 19:47:09 | 显示全部楼层
FishC 发表于 2024-3-8 19:45
没关系,让我来帮你思考一下解决办法。这个问题可以使用动态规划来解决。

首先,我们需要定义一个二维数 ...

能用c++完整写出吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-8 19:47:24 | 显示全部楼层    本楼为最佳答案   
亿壹粟 发表于 2024-03-08 19:47
能用c++完整写出吗


当然可以!下面是用 C++ 完整实现的代码:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. struct Food {
  5.     char name;
  6.     int tempt;
  7. };

  8. int main() {
  9.     int x, n;
  10.     cin >> x >> n;

  11.     vector<Food> foods(n);
  12.     for (int i = 0; i < n; i++) {
  13.         cin >> foods[i].name >> foods[i].tempt;
  14.     }

  15.     vector<vector<int>> dp(n + 1, vector<int>(x + 1, 1001)); // 初始化 dp 数组
  16.     dp[0][0] = 0;

  17.     for (int i = 1; i <= n; i++) {
  18.         dp[i][0] = 0;
  19.         for (int j = 1; j <= x; j++) {
  20.             dp[i][j] = dp[i - 1][j];
  21.             if (j >= foods[i - 1].tempt) {
  22.                 dp[i][j] = min(dp[i][j], dp[i - 1][j - foods[i - 1].tempt] + 1);
  23.             }
  24.         }
  25.     }

  26.     if (dp[n][x] > 1000) { // 无法捕获牛可乐
  27.         cout << -1 << endl;
  28.     } else {
  29.         string ans;
  30.         int i = n, j = x;
  31.         while (i > 0 && j > 0) {
  32.             if (dp[i][j] == dp[i - 1][j]) { // 没有取这个食物
  33.                 i--;
  34.             } else { // 取了这个食物
  35.                 ans = foods[i - 1].name + ans;
  36.                 j -= foods[i - 1].tempt;
  37.             }
  38.         }
  39.         cout << ans << endl;
  40.     }

  41.     return 0;
  42. }
复制代码


希望这段代码能够帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-8 19:49:17 | 显示全部楼层
FishC 发表于 2024-3-8 19:47
当然可以!下面是用 C++ 完整实现的代码:

OK。我有思路了,不过你提供的代码没有理解我的题意
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-8 19:49:40 | 显示全部楼层
亿壹粟 发表于 2024-03-08 19:49
OK。我有思路了,不过你提供的代码没有理解我的题意


非常抱歉,我理解错了你的题意。让我重新思考一下问题并提供正确的代码。

根据题意,我们需要选择一些食物,使得它们的诱惑力之和不小于x,并且食物数量最少。这是一个经典的背包问题,可以使用动态规划来解决。我们定义一个二维数组dp,其中dp[i][j]表示在前i个食物中选择,诱惑力之和不小于j时,所需要的最少食物数量。

接下来,我们可以使用一个循环来遍历每一种食物,并更新dp数组。对于每一种食物,我们有两种选择:要么选择不取这个食物,要么选择取这个食物。如果选择不取这个食物,则dp[i][j] = dp[i-1][j](即前i-1个食物中已经满足诱惑力为j的条件)。如果选择取这个食物,则dp[i][j] = dp[i-1][j-w] + 1(即前i-1个食物中满足诱惑力为j-w的条件,并且加上当前食物)。

最后,我们只需要找到满足dp[n][x]的最小值,并输出对应的食物名称。

下面是完整的代码实现:

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;

  4. struct Food {
  5.     char name;
  6.     int tempt;
  7. };

  8. int main() {
  9.     int x, n;
  10.     cin >> x >> n;

  11.     vector<Food> foods(n);
  12.     for (int i = 0; i < n; i++) {
  13.         cin >> foods[i].name >> foods[i].tempt;
  14.     }

  15.     vector<vector<int>> dp(n + 1, vector<int>(x + 1, 1001));
  16.     dp[0][0] = 0;

  17.     for (int i = 1; i <= n; i++) {
  18.         for (int j = 0; j <= x; j++) {
  19.             dp[i][j] = dp[i-1][j]; // 不取这个食物
  20.             if (j >= foods[i-1].tempt) {
  21.                 dp[i][j] = min(dp[i][j], dp[i-1][j-foods[i-1].tempt] + 1); // 取这个食物
  22.             }
  23.         }
  24.     }

  25.     if (dp[n][x] == 1001) {
  26.         cout << -1 << endl;
  27.     } else {
  28.         string ans = "";
  29.         int i = n, j = x;
  30.         while (i > 0 && j > 0) {
  31.             if (dp[i][j] == dp[i-1][j]) { // 没有取这个食物
  32.                 i--;
  33.             } else { // 取了这个食物
  34.                 ans = foods[i-1].name + ans;
  35.                 j -= foods[i-1].tempt;
  36.                 i--;
  37.             }
  38.         }
  39.         cout << ans << endl;
  40.     }

  41.     return 0;
  42. }
复制代码


希望这次能够满足你的需求!如果还有任何问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-8 20:03:51 | 显示全部楼层
FishC 发表于 2024-3-8 19:49
非常抱歉,我理解错了你的题意。让我重新思考一下问题并提供正确的代码。

根据题意,我们需要选择一 ...

你的手上有一张日程表,上面列出了一些事件发生的时间。你想在每一个日程事件开始前1,3和5分钟各设定一个闹钟,最后,将这些闹钟按照时间先后顺序依次输出(就像你
在手机闹钟界面看到的一样)。注意,如果有多个闹钟被设定在同一时间,那么它们会被视为同一个。
正式地,假设闹钟a将在ha时ma分响起,闹钟b在hb时mb分响起,那么:

· 如果ha<hb,闹钟a先于闹钟b响起;
· 当ha=hb时,如果ma<mb,闹钟a先于闹钟b响起;
· 当 ha=hb时,如果ma=mb,闹钟a和闹钟b应当被看作同一个闹钟。

输入描述:

每个测试文件仅有一组测试数据。
第一行输入一个整数 n(1≤n≤1000)表示日程的数量。
随后 n 行,第 i 行输入两个整数 h; 和 m; (3≤hi≤23,0≤m;≤59)表示第i 个日程开始的时分(采用24小时制),数字不包含前导零。注意可能有多
个日程事件开始于同一时刻。

输出描述:

第一行输出一个整数 m,代表设定的闹钟数量。
随后 m 行,第i 行输出两个由单个空格分隔的整数 h'2和m2(0≤h2≤23,0≤m2≤59),代表第i 个闹钟在 h'2时m2分响起。数字不应当包含前导
零。
用c++编写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-8 20:04:10 | 显示全部楼层
亿壹粟 发表于 2024-03-08 20:03
你的手上有一张日程表,上面列出了一些事件发生的时间 ...


明白了,你需要根据日程表上的事件时间,为每个事件设置闹钟。每个事件的闹钟需要在事件开始前1、3和5分钟分别响起。然后按照闹钟的时间顺序输出。下面是一个可能的解决方案:

  1. # 定义一个闹钟类,包括小时和分钟
  2. class Alarm:
  3.     def __init__(self, hour, minute):
  4.         self.hour = hour
  5.         self.minute = minute

  6. # 读取日程表中的事件时间
  7. n = int(input())  # 事件数量
  8. schedule = []  # 存储事件时间
  9. for i in range(n):
  10.     time = input().split(':')
  11.     hour = int(time[0])
  12.     minute = int(time[1])
  13.     schedule.append(Alarm(hour, minute))

  14. # 设置闹钟并排序
  15. alarms = []
  16. for alarm in schedule:
  17.     alarms.append(Alarm(alarm.hour, alarm.minute - 5))
  18.     alarms.append(Alarm(alarm.hour, alarm.minute - 3))
  19.     alarms.append(Alarm(alarm.hour, alarm.minute - 1))
  20. alarms.sort(key=lambda x: (x.hour, x.minute))

  21. # 输出闹钟时间
  22. for alarm in alarms:
  23.     print('{:02d}:{:02d}'.format(alarm.hour, alarm.minute))
复制代码


这段代码首先读取事件数量和每个事件的时间,并将其存储在schedule列表中。然后,根据每个事件的时间设置闹钟,将闹钟存储在alarms列表中。最后,通过对alarms列表进行排序,按照时间顺序输出每个闹钟的小时和分钟。

希望这个解决方案能够帮到你!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-8 20:04:34 | 显示全部楼层
FishC 发表于 2024-3-8 20:04
明白了,你需要根据日程表上的事件时间,为每个事件设置闹钟。每个事件的闹钟需要在事件开始前1、3和5 ...

用基础c++算法编写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-8 20:04:50 | 显示全部楼层
亿壹粟 发表于 2024-03-08 20:04
用基础c++算法编写


当然可以!下面是使用基础C++算法编写的解决方案:

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>

  4. // 定义闹钟类,包括小时和分钟
  5. struct Alarm {
  6.     int hour;
  7.     int minute;
  8. };

  9. // 自定义排序函数,按照时间先后顺序排序
  10. bool compareAlarm(const Alarm& a, const Alarm& b) {
  11.     if (a.hour == b.hour) {
  12.         return a.minute < b.minute;
  13.     } else {
  14.         return a.hour < b.hour;
  15.     }
  16. }

  17. int main() {
  18.     int n; // 事件数量
  19.     std::cin >> n;

  20.     std::vector<Alarm> schedule; // 存储事件时间
  21.     for (int i = 0; i < n; ++i) {
  22.         int hour, minute;
  23.         char colon;
  24.         std::cin >> hour >> colon >> minute;
  25.         schedule.push_back({hour, minute});
  26.     }

  27.     std::vector<Alarm> alarms; // 存储闹钟时间
  28.     for (const auto& event : schedule) {
  29.         alarms.push_back({event.hour, event.minute - 5});
  30.         alarms.push_back({event.hour, event.minute - 3});
  31.         alarms.push_back({event.hour, event.minute - 1});
  32.     }

  33.     std::sort(alarms.begin(), alarms.end(), compareAlarm); // 按照时间顺序排序

  34.     // 输出闹钟时间
  35.     for (const auto& alarm : alarms) {
  36.         std::cout << std::setw(2) << std::setfill('0') << alarm.hour << ":"
  37.                   << std::setw(2) << std::setfill('0') << alarm.minute << std::endl;
  38.     }

  39.     return 0;
  40. }
复制代码


这段代码使用了`vector`来存储事件时间和闹钟时间,并通过自定义的排序函数`compareAlarm`来按照时间先后顺序进行排序。最后,使用`setw`和`setfill`来保持输出格式的对齐。

希望这个基础C++算法的解决方案能够满足你的需求!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-8 20:05:32 | 显示全部楼层
FishC 发表于 2024-3-8 20:04
当然可以!下面是使用基础C++算法编写的解决方案:

编译错误:您提交的代码无法完成编译
a.cpp:43:27: error: no member named 'setw' in namespace 'std'
std::cout << std::setw(2) << std::setfill('0') << alarm.hour << ":"
~~~~~^
a.cpp:43:43: error: no member named 'setfill' in namespace 'std'
std::cout << std::setw(2) << std::setfill('0') << alarm.hour << ":"
~~~~~^
a.cpp:44:27: error: no member named 'setw' in namespace 'std'
<< std::setw(2) << std::setfill('0') << alarm.minute << std::endl;
~~~~~^
a.cpp:44:43: error: no member named 'setfill' in namespace 'std'
<< std::setw(2) << std::setfill('0') << alarm.minute << std::endl;
~~~~~^
4 errors generated.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-8 20:06:03 | 显示全部楼层
亿壹粟 发表于 2024-03-08 20:05
编译错误:您提交的代码无法完成编译
a.cpp:43:27: er ...


抱歉,我忘记包含 `<iomanip>` 头文件以使用 `std::setw` 函数。下面是修改后的代码:

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <iomanip>

  5. // 定义闹钟类,包括小时和分钟
  6. struct Alarm {
  7.     int hour;
  8.     int minute;
  9. };

  10. // 自定义排序函数,按照时间先后顺序排序
  11. bool compareAlarm(const Alarm& a, const Alarm& b) {
  12.     if (a.hour == b.hour) {
  13.         return a.minute < b.minute;
  14.     } else {
  15.         return a.hour < b.hour;
  16.     }
  17. }

  18. int main() {
  19.     int n; // 事件数量
  20.     std::cin >> n;

  21.     std::vector<Alarm> schedule; // 存储事件时间
  22.     for (int i = 0; i < n; ++i) {
  23.         int hour, minute;
  24.         char colon;
  25.         std::cin >> hour >> colon >> minute;
  26.         schedule.push_back({hour, minute});
  27.     }

  28.     std::vector<Alarm> alarms; // 存储闹钟时间
  29.     for (const auto& event : schedule) {
  30.         alarms.push_back({event.hour, event.minute - 5});
  31.         alarms.push_back({event.hour, event.minute - 3});
  32.         alarms.push_back({event.hour, event.minute - 1});
  33.     }

  34.     std::sort(alarms.begin(), alarms.end(), compareAlarm); // 按照时间顺序排序

  35.     // 输出闹钟时间
  36.     for (const auto& alarm : alarms) {
  37.         std::cout << std::setfill('0') << std::setw(2) << alarm.hour << ":"
  38.                   << std::setfill('0') << std::setw(2) << alarm.minute << std::endl;
  39.     }

  40.     return 0;
  41. }
复制代码


希望这次可以成功编译和运行!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 03:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表