解题思路:
按照训练次数从小到大排序, 从训练次数少的开始枚举,贪心找单独训练还是组团训练
注意事项:
参考代码:
#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分
7 人评分
求圆的面积 (C语言代码)浏览:1366 |
C语言程序设计教程(第三版)课后习题11.8 (C语言代码)浏览:910 |
2005年春浙江省计算机等级考试二级C 编程题(1) (C语言代码)浏览:637 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:913 |
C语言程序设计教程(第三版)课后习题10.1 (C语言代码)浏览:585 |
淘淘的名单 (C语言代码)浏览:1309 |
敲七 (C++代码)浏览:1119 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:529 |
上车人数 (C语言代码)浏览:752 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:608 |