小陈子的运动会(解出给解决方案)

运动会到了,小陈子虽然他太菜了,但他很想参加跑步比赛。但是他那邪恶的体委让他的能力值必须达到x才能让他参加。

但是他时间有限于是他找到了你,帮他计划训练方案。

输入

第1行一个整数x表示目标提升,a表示拥有的时间;
第2行一个整数n代表有n个训练方案(必须完整训练才会有提升,接下来n行整数,每行一个t(时间)和w(提升)

输出

若可以参加运动会并打体委的脸那么输出Yes,否则输出No;

样例输入

10 10
3
6 4
4 9
3 5

样例输出

Yes

@周晨捷 @楼逸杨 @俞天行 @陈之昊羽 @金文彦成

要用动态规划不然不算!!!!

就不用cai guai

#include <bits/stdc++.h>

using namespace std;

struct node {
	int time; // 时间
	int worth; // 提升值
};

bool cmp(node a, node b) {
	return a.time == b.time ? a.worth > b.worth : a.time < b.time;
}

int main(void) 
{
	int x, a; // x为目标提升,a为拥有的时间
	cin >> x >> a;
	int n; // 训练方案数量
	cin >> n;
	
	vector<node> plans(n);
	for (int i = 0; i < n; i++) {
		cin >> plans[i].time >> plans[i].worth;
	}
	
	// 按时间排序,时间相同则按提升值降序
	sort(plans.begin(), plans.end(), cmp);
	
	bool can_participate = false;
	int total_worth = 0;
	int time_spent = 0;
	
	for (int i = 0; i < n && time_spent + plans[i].time <= a; i++) {
		time_spent += plans[i].time;
		total_worth += plans[i].worth;
		if (total_worth >= x) {
			can_participate = true;
			break;
		}
	}
	
	if (can_participate) {
		cout << "Yes";
	} else {
		cout << "No";
	}
	
	return 0;
}

@陈洪森 森洪陈太有实力了

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool canParticipate(int target, int timeAvailable, vector<pair<int, int>> &plans) {
    sort(plans.begin(), plans.end());
    int n = plans.size();
    int dp[timeAvailable + 1] = {0};
    for (int i = 0; i < n; ++i) {
        for (int j = timeAvailable; j >= plans[i].first; --j) {
            dp[j] = max(dp[j], dp[j - plans[i].first] + plans[i].second);
        }
    }
    return dp[timeAvailable] >= target;
}

int main() {
    int target, timeAvailable;
    cin >> target >> timeAvailable;
    int n;
    cin >> n;
    vector<pair<int, int>> plans(n);
    for (int i = 0; i < n; ++i) {
        cin >> plans[i].first >> plans[i].second;
    }
    cout << (canParticipate(target, timeAvailable, plans) ? "Yes" : "No") << endl;
    return 0;
}
1 个赞

动态归划呐,还有你们这代码都扔给AI的吧

代码解释:

  1. 我们使用动态规划方法来解决这个问题。dp[j] 表示在 j 时间内能达到的最大提升。
  2. 首先,我们按照训练时间对训练方案进行排序。
  3. 然后,我们遍历所有训练方案,对于每个方案,我们从后往前更新 dp 数组,以确保在当前时间内选择该训练方案是否能带来更大的提升。
  4. 最后,我们检查 dp[timeAvailable] 是否大于等于目标提升,如果是,则小陈子可以参加运动会并打体委的脸;否则,他无法参加。

注意:在实际应用中,输入和输出的格式应与题目要求一致,且应处理可能的输入错误。但在这个示例中,为了简洁,我们假设输入总是有效的。
@陈洪森

1 个赞

怎么你们可能会打这么长的变量名

不是,我最近在学习抽象的变量名,提高我的英语素养
楼**才是扔AI的,代码解释是他会写的?

对的,我会写

1 个赞

你写的?
e
6
不信

对呀

1 个赞

你会pair?!

AI不是在代码中就写注释了吗

1 个赞
#include <iostream>
using namespace std;

int main() {
    // 读取第一行的两个整数:x(目标提升)和a(拥有的时间)
    int x, a;
    cin >> x >> a;

    // 读取第二行的整数n,表示有n个任务或选项
    int n;
    cin >> n;

    // 假设每个任务或选项都有一些特定的属性,这里我们仅以一个整数为例(比如每个任务所需的时间或提供的提升值)
    // 你可以根据需要调整这个数组或容器的类型
    int tasks[100]; // 假设最多有100个任务,根据实际需要调整大小或使用动态数据结构如vector

    // 读取接下来的n行数据
    for (int i = 0; i < n; ++i) {
        cin >> tasks[i]; // 假设这里读取的是每个任务所需的时间或提供的提升值
    }

    // 现在你可以根据x, a和tasks数组中的数据进行你的逻辑处理
    // 例如,选择哪些任务可以最大化提升同时不超过拥有的时间a

    // 这里只是一个简单的示例,没有实现具体的逻辑
    cout << "目标提升: " << x << ", 拥有的时间: " << a << ", 任务数量: " << n << endl;
    // 输出任务信息(仅作为示例)
    for (int i = 0; i < n; ++i) {
        cout << "任务" << i+1 << ": " << tasks[i] << endl;
    }

    return 0;
}

C++ pair的基本用法总结(整理)_c++ pair用法-CSDN博客

1 个赞

自招了,而且我不写注释他们看得懂?还有,你代码原来打空格呀

#include <iostream>
using namespace std;
int main() {
    int x, a;
    cin >> x >> a;
    int n;
    cin >> n;
    int tasks[100];
    for (int i = 0; i < n; ++i) {
        cin >> tasks[i]; 
    }
    cout << "目标提升: " << x << ", 拥有的时间: " << a << ", 任务数量: " << n << endl;
    for (int i = 0; i < n; ++i) {
        cout << "任务" << i+1 << ": " << tasks[i] << endl;
    }
    return 0;
}

不,我招啥了
打空格不是直接就可以格式化的吗

1 个赞

e,懒得管你,我刷题去了,还有 @陈洪森 对不起, @Dalton 关贴

P9228

1 个赞