解题思路:
按照训练次数从小到大排序, 从训练次数少的开始枚举,贪心找单独训练还是组团训练
注意事项:
参考代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct A {
int val, cnt;
}f[100010];
// res 表示总消耗金币数量
int n, m, res;
// 按照次数从小到大排序
bool is(A a, A b) {
return a.cnt < b.cnt;
}
signed main() {
cin >> n >> m;
// a 表示从第 i 个士兵到第 n 个士兵每个训练一次的总和
int a = 0;
for(int i = 1; i <= n; i++) {
cin >> f[i].val >> f[i].cnt;
a += f[i].val;
}
sort(f + 1, f + n + 1, is);
// tk 表示组团训练的次数
int tk = 0;
for(int i = 1; i <= n; i++) {
/*
如果组团总次数大于等于这个士兵需要训练的次数
说明这个士兵不用训练了,更新 a 的值
*/
if(f[i].cnt <= tk) {
a -= f[i].val;
continue;
}
/*
如果组团训练比较划算,比从现在开始到第 n 个士兵单独训练一次划算
就组团训练 f[i][1] - tk表示这个士兵还需要训练几次
*/
if(a >= m) {
// 总额加上这个士兵需要组团训练的次数
res += (f[i].cnt - tk) * m;
// 更新组团训练次数
tk += f[i].cnt - tk;
} else {
res += (f[i].cnt - tk) * f[i].val;
}
a -= f[i].val;
}
cout << res << endl;
return 0;
}0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复