官方题解 | 废品回收
2025-01-05 22:42:31
发布于:云南
36阅读
0回复
0点赞
贪心,将价值减去价格,每次挑选最大的即可(注意!不需要拿满 件!如果处理这个废品后的收益小于等于 就不要再拿了)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm> 
using namespace std;
vector <int> a, b;
int main(){
	cin.tie(nullptr) -> sync_with_stdio(0);
	cout.tie(nullptr) -> sync_with_stdio(0);
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		char c;
		int x, y;
		cin >> c >> x >> y;
		if(c == 'A') a.push_back(x - y);
		else b.push_back(x - y);
	}
	sort(a.begin(), a.end(), greater <int>());//排序,这样就能挑最大的
	sort(b.begin(), b.end(), greater <int>());
	int ct = 0;
	for(int i = 0; i < m && i < a.size() && a[i] > 0; i++) ct += a[i];//拿取
	for(int i = 0; i < m && i < b.size() && b[i] > 0; i++) ct += b[i];
	cout << ct;
	return 0;
}
时间复杂度:.
当然,你也可以使用堆来实现在线得出最优解(),或者用背包DP(),以下给出背包DP的代码:
#include<bits/stdc++.h>
using namespace std;
int A_v[1005],B_v[1005];
bool cmp(int a,int b){return a > b;}
int main(){
    int n,k; cin >> n >> k;
    int A_idx = 1,B_idx = 1;
    while(n--){
        char op; cin >> op;
        int v,p; cin >> v >> p;
        if(op == 'A') A_v[A_idx++] = v - p;
        else B_v[B_idx++] = v - p;
    }
    sort(A_v + 1,A_v + A_idx + 1,cmp);
    sort(B_v + 1,B_v + B_idx + 1,cmp);
    long long ans = 0;
    for(int i = 1;i <= k;i++){
        if(A_v[i] > 0) ans += A_v[i];
        else break;
    }
    for(int i = 1;i <= k;i++){
        if(B_v[i] > 0) ans += B_v[i];
        else break;
    }
    cout << ans;
    return 0;
}这里空空如也







有帮助,赞一个