
假设我们有两个数组p和c,每个数组都有D个元素,并且还有另一个数字G。考虑在编程竞赛中,每个问题的分数都基于其难度。问题p[i]的分数为100i。这些p[1] + … + p[D]问题是竞赛中的所有问题。编程网站上的用户有一个数字total_score。用户的total_score是以下两个元素的和。
基础分数:解决的所有问题的分数之和
奖励:当用户解决所有分数为100i的问题时,除了基础分数外,还会获得完美奖励c[i]。
Amal是竞赛中的新手,还没有解决任何问题。他的目标是获得总分G或更多分。我们需要找到他至少需要解决多少问题才能达到这个目标。
立即学习“C++免费学习笔记(深入)”;
因此,如果输入是G = 500; P = [3, 5]; C = [500, 800],那么输出将是3
步骤
为了解决这个问题,我们将按照以下步骤进行:
D := size of pmi := 10000for initialize i := 0, when i < 1 << D, update (increase i by 1), do:sum := 0count := 0at := 0an array to store 10 bits b, initialize from bit value of ifor initialize j := 0, when j < D, update (increase j by 1), do: if jth bit in b is 1, then: count := p[j] sum := sum + ((j + 1) * 100 * p[j] + c[j] Otherwise at := jif sum < G, then: d := (G - sum + (at + 1) * 100 - 1) / ((at + 1) * 100) if d = G, then: mi := minimum of mi and countreturn mi
Example
让我们看下面的实现以更好地理解−
#include using namespace std;int solve(int G, vector p, vector c){ int D = p.size(); int mi = 10000; for (int i = 0; i < 1 << D; i++){ int sum = 0; int count = 0; int at = 0; bitset b(i); for (int j = 0; j < D; j++){ if (b.test(j)){ count += p.at(j); sum += (j + 1) * 100 * p.at(j) + c.at(j); } else { at = j; } } if (sum < G){ int d = (G - sum + (at + 1) * 100 - 1) / ((at + 1) * 100); if (d = G) { mi = min(mi, count); } } return mi;}int main() { int G = 500; vector P = { 3, 5 }; vector C = { 500, 800 }; cout << solve(G, P, C) << endl;}
Input
500, { 3, 5 }, { 500, 800 }
输出
3
以上就是C++程序来找出至少需要获得多少分才能达到G分的分数的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1444545.html
微信扫一扫
支付宝扫一扫