一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
2.巧克力 - 蓝桥云课 (lanqiao.cn)
二、解题报告
1、思路分析
做法:我们将巧克力按照价格升序排序,然后顺序枚举巧克力wi,查找小于等于bi的日期中最大的未被选择日期,将当前巧克力分配给该日期
证明正确性:
假如存在最优解和贪心策略不一致,则一定存在wi 分配给 第 x天,wj分配给第y天
满足:x < y <= bi,显然wj也可以满足第x天,那么二者交换,并不会使得解更差
我们调整所有逆序对不会使得解更差,故贪心策略成立
2、复杂度
时间复杂度: O(nlogm)空间复杂度:O(n)
3、代码详解
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, m, s;
set<int> st;
struct node{
int a, b, c;
bool operator<(const node& x) const{
return a < x.a;
}
}nodes[N];
signed main(){
cin >> m >> n;
for(int i = 0, a, b, c; i < n; i ++){
cin >> a >> b >> c;
nodes[i] = { a, b, c };
}
sort(nodes, nodes + n);
for(int i = 1; i <= m; i ++) st.insert(i);
for(int i = 0; st.size() && i < n; i ++) {
auto it = st.upper_bound(nodes[i].b);
while(nodes[i].c && st.size() && it != st.begin()){
it = prev(it);
st.erase(it), nodes[i].c --, s += nodes[i].a;
it = st.upper_bound(nodes[i].b);
}
}
if(st.size()) cout << -1;
else cout << s;
return 0;
}