鱼C论坛

 找回密码
 立即注册
查看: 691|回复: 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++ 完整实现的代码:
#include <iostream>
#include <vector>
using namespace std;

struct Food {
    char name;
    int tempt;
};

int main() {
    int x, n;
    cin >> x >> n;

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

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

    for (int i = 1; i <= n; i++) {
        dp[i][0] = 0;
        for (int j = 1; j <= x; j++) {
            dp[i][j] = dp[i - 1][j];
            if (j >= foods[i - 1].tempt) {
                dp[i][j] = min(dp[i][j], dp[i - 1][j - foods[i - 1].tempt] + 1);
            }
        }
    }

    if (dp[n][x] > 1000) { // 无法捕获牛可乐
        cout << -1 << endl;
    } else {
        string ans;
        int i = n, j = x;
        while (i > 0 && j > 0) {
            if (dp[i][j] == dp[i - 1][j]) { // 没有取这个食物
                i--;
            } else { // 取了这个食物
                ans = foods[i - 1].name + ans;
                j -= foods[i - 1].tempt;
            }
        }
        cout << ans << endl;
    }

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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]即可。

下面是完整的代码实现:
x = int(input())  # 需要的诱惑力
n = int(input())  # 零食种类数量

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

for i in range(1, n+1):
    ch, w = input().split()
    w = int(w)
    
    for j in range(1, x+1):
        dp[i][j] = dp[i-1][j]  # 不取这个食物
        
        if j >= w:
            dp[i][j] = min(dp[i][j], dp[i-1][j-w] + 1)  # 取这个食物

if dp[n][x] == 0 or dp[n][x] > 1000:
    print(-1)
else:
    ans = ''
    i, j = n, x
    while i > 0 and j > 0:
        if dp[i][j] == dp[i-1][j]:  # 没有取这个食物
            i -= 1
        else:  # 取了这个食物
            ans = ch + ans
            j -= w
    
    print(ans)

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

能用c++完整写出吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


当然可以!下面是用 C++ 完整实现的代码:
#include <iostream>
#include <vector>
using namespace std;

struct Food {
    char name;
    int tempt;
};

int main() {
    int x, n;
    cin >> x >> n;

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

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

    for (int i = 1; i <= n; i++) {
        dp[i][0] = 0;
        for (int j = 1; j <= x; j++) {
            dp[i][j] = dp[i - 1][j];
            if (j >= foods[i - 1].tempt) {
                dp[i][j] = min(dp[i][j], dp[i - 1][j - foods[i - 1].tempt] + 1);
            }
        }
    }

    if (dp[n][x] > 1000) { // 无法捕获牛可乐
        cout << -1 << endl;
    } else {
        string ans;
        int i = n, j = x;
        while (i > 0 && j > 0) {
            if (dp[i][j] == dp[i - 1][j]) { // 没有取这个食物
                i--;
            } else { // 取了这个食物
                ans = foods[i - 1].name + ans;
                j -= foods[i - 1].tempt;
            }
        }
        cout << ans << endl;
    }

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

OK。我有思路了,不过你提供的代码没有理解我的题意
想知道小甲鱼最近在做啥?请访问 -> 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]的最小值,并输出对应的食物名称。

下面是完整的代码实现:
#include <iostream>
#include <vector>
using namespace std;

struct Food {
    char name;
    int tempt;
};

int main() {
    int x, n;
    cin >> x >> n;

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

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

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

    if (dp[n][x] == 1001) {
        cout << -1 << endl;
    } else {
        string ans = "";
        int i = n, j = x;
        while (i > 0 && j > 0) {
            if (dp[i][j] == dp[i-1][j]) { // 没有取这个食物
                i--;
            } else { // 取了这个食物
                ans = foods[i-1].name + ans;
                j -= foods[i-1].tempt;
                i--;
            }
        }
        cout << ans << endl;
    }

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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++编写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


明白了,你需要根据日程表上的事件时间,为每个事件设置闹钟。每个事件的闹钟需要在事件开始前1、3和5分钟分别响起。然后按照闹钟的时间顺序输出。下面是一个可能的解决方案:
# 定义一个闹钟类,包括小时和分钟
class Alarm:
    def __init__(self, hour, minute):
        self.hour = hour
        self.minute = minute

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

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

# 输出闹钟时间
for alarm in alarms:
    print('{:02d}:{:02d}'.format(alarm.hour, alarm.minute))

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

用基础c++算法编写
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


当然可以!下面是使用基础C++算法编写的解决方案:
#include <iostream>
#include <vector>
#include <algorithm>

// 定义闹钟类,包括小时和分钟
struct Alarm {
    int hour;
    int minute;
};

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

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

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

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

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

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

    return 0;
}

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> 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.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

// 定义闹钟类,包括小时和分钟
struct Alarm {
    int hour;
    int minute;
};

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

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

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

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

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

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

    return 0;
}

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 18:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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