[Daimayuan]新国王游戏(C++,数学)

这篇具有很好参考价值的文章主要介绍了[Daimayuan]新国王游戏(C++,数学)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

又到了 H H H 国国庆, 国王再次邀请 n n n 位大臣来玩有奖游戏。上次国庆被众臣吐槽国王小气后,国王决定今年大方点,改变游戏规则且不再参与游戏,免得被大臣们质疑。首先, 他让每位大臣在左、 右手上面分别写下一个正整数。然后让这 n n n 位大臣排成一排。排好队后, 所有的大臣都会获得国王奖赏的若千金币, 每位大臣获得的金币数分别是:排在该大臣后面的所有人的左手上的数的乘积乘以他自己右手上的数。国王希望所有大臣获得的金币数之和最多,所以他想请你帮他重新安排一下队伍的顺序。

简而言之,给定 n n n 对数 a i , b i a_i,b_i ai,bi,找到一种排列顺序,使得 b 1 × a 2 ∗ a 3 ∗ … a n + b 2 × a 3 ∗ a 4 ∗ … a n + ⋯ + b n b_1×a_2∗a_3∗…a_n+b_2×a_3∗a_4∗…a_n+⋯+b_n b1×a2a3an+b2×a3a4an++bn 最大,求最大值,由于答案可能很大,需要对 1000000007 1000000007 1000000007 取模

输入格式:

第一行,包含一个整数 n n n。 第二行到第 n + 1 n+1 n+1 行,包含两个整数 a i , b i a_i,b_i ai,bi

输出格式:

输出一行,表示按某种排序后的 b 1 × a 2 ∗ a 3 ∗ … a n + b 2 × a 3 ∗ a 4 ∗ … a n + ⋯ + b n b_1×a_2∗a_3∗…a_n+b_2×a_3∗a_4∗…a_n+⋯+b_n b1×a2a3an+b2×a3a4an++bn 的最大值对 1000000007 1000000007 1000000007 取模的结果

样例输入
2
1 2
3 4
样例输出
10
说明

只有两种情况:

1. 1. 1.

1 2
3 4

( 2 ∗ 3 ) + 4 = 10 (2∗3)+4=10 (23)+4=10

2. 2. 2.

3 4
1 2

( 4 ∗ 1 ) + 2 = 6 ( 4 ∗ 1 ) + 2 = 6 (4∗1)+2=6(4∗1)+2=6 (41)+2=6(41)+2=6

所以答案为 10 10 10

数据限制

对于 100 100 100% 的数据,保证 1 ≤ n ≤ 1 0 6 1≤n≤10^6 1n106, 1 ≤ a i , b i ≤ 2 30 1≤a_i,b_i≤2^{30} 1ai,bi230

解题思路

思路很简单:先排序,然后累加求和

解题关键在于如何排序

采用算法sort()进行排序,我们需要做的就是重载比较运算符,而重载比较运算符,我们就只需要考虑一种简单的比较情形:相邻对换

对于 i , i + 1 i,i+1 i,i+1两位大臣,我们不需要考虑其 i i i前面的人和 i + 1 i+1 i+1后面的人,因为他们的顺序是不变的

我们只需要考虑两位大臣调换前后二者获取的金币变多了还是变少了

在调换之前: b i ∗ a i + 1 + b i + 1 b_i*a_{i+1}+b_{i+1} biai+1+bi+1

在调换之后: b i + 1 ∗ a i + b i b_{i+1}*a_i+b_i bi+1ai+bi

比较二者的大小即可知道哪种排序获得的金币更多

AC代码如下文章来源地址https://www.toymoban.com/news/detail-400786.html

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int max_n = 1e6;
const int max_ab = pow(2, 30);
const int mod_num = 1000000007;

struct person { long long l, r; }persons[max_n + 1];

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> persons[i].l >> persons[i].r;
	sort(persons + 1, persons + 1 + n, [](person p1, person p2) {
		return p1.r * p2.l + p2.r > p2.r * p1.l + p1.r;
		});
	long long ans = 0;
	long long sum = 1;
	for (int i = n; i > 0; i--) {
		ans = (ans + persons[i].r * sum) % mod_num;
		sum = (sum * persons[i].l) % mod_num;
	}
	cout << ans << endl;
	return 0;
}

到了这里,关于[Daimayuan]新国王游戏(C++,数学)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [Daimayuan] 吃糖果(C++,贪心)

    桌子上从左到右放着 n n n 个糖果。糖果从左到右编号,第 i i i 块糖果的重量为 w i w_i w i ​ 。小明和小红要吃糖果。 小明从左边开始吃任意数量的糖果。(连续吃,不能跳过糖果) 小红从右边开始吃任意数量的糖果。(连续吃,不能跳过糖果) 当然,如果小明吃了某个糖果

    2024年02月02日
    浏览(41)
  • [Daimayuan] 碰撞2(C++,模拟)

    在 x O y xOy x O y 坐标系中有 N N N 个人,第 i i i 个人的位置是 ( X i , Y i ) (X_i,Y_i) ( X i ​ , Y i ​ ) ,并且每个人的位置都不同。 我们有一个由 L 和 R 组成的长为 N N N 的字符串 S S S , S i = S_i= S i ​ = R 代表第 i i i 个人面向右, S i = S_i= S i ​ = L 代表第 i i i 个人面向左。 现在所

    2023年04月09日
    浏览(33)
  • 国庆 射击气球python小游戏

    效果图

    2024年02月07日
    浏览(54)
  • [Daimayuan] 最短路计数(C++,DP,图论)

    题目描述 给出一个 N N N 个顶点 M M M 条边的无向无权图。 问从顶点 1 1 1 开始,到其他每个点的最短路有几条。 输入格式 第 1 1 1 行包含两个正整数 N N N , M M M 。 接下来 M M M 行,每行两个正整数 x , y x,y x , y 表示存在一条由顶点 x x x 到顶点 y y y 的边。(可能存在重边和自环

    2023年04月22日
    浏览(36)
  • [Daimayuan] 三段式(C++,数组前缀和)

    有一个长度为 n n n 的序列,现在我们想把它切割成三段(每一段都是连续的),使得每一段的元素总和都相同,请问有多少种不同的切割方法 输入描述 第一行给出一个数 n n n ,( 1 ≤ n ≤ 1 0 5 1≤n≤10^5 1 ≤ n ≤ 1 0 5 ) 第二行给出序列 a 1 a_1 a 1 ​ , a 2 a_2 a 2 ​ , a 3 a_3 a 3 ​

    2024年02月05日
    浏览(33)
  • 【C++历险记】国庆专辑---探索多态迷宫的代码之旅

    🎉博客主页:.小智 🎉欢迎关注:👍点赞🙌收藏✍️留言 🎉系列专栏:C++终极篇 🎉代码仓库:小智的代码仓库 多态多态顾名思义就是多种形态,比如我们要完成某一件事情,不同的对象去完成,我们产生的结果是不一样的。 举个栗子我们平时的买火车票,就有这几种分

    2024年02月08日
    浏览(39)
  • 母亲节到了,写一个简单的C++代码给老妈送上一个爱心祝福

    🍎 博客主页:🌙@披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 C/C++专栏 🌙请不要相信胜利就像山坡上的蒲公英一样唾手可得,但是请相信,世界上总有一些美好值得我们全力以赴,哪怕粉身碎骨!🌙 🍉一起加油,去追寻、去成为更好的自己

    2024年02月04日
    浏览(41)
  • 《国王的演讲》中最后的演讲稿

    In this grave hour, perhaps the most fateful in history,I send to every household of my peoples,both at home and overseas, this message, spoken with the same depth of feeling for each one of you as if I were able to cross your threshold and speak to you myself. 在这个庄严的时刻,或许是国家历史上最生死攸关的时刻,无论你身处何方

    2024年02月06日
    浏览(29)
  • 25s数学测试小游戏

    编写一个WPF应用程序,设计一个有时间限制(25s)的数学测验小游戏。要求玩家必须在规定的时间内回答4道随机出现的加,减,乘,除计算题。如果玩家在规定的时间内全部回答正确,弹出对话框显示“恭喜,过关成功。”,否则弹出对话框显示“过关失败,请继续努力!”

    2024年02月16日
    浏览(33)
  • 【动态规划之“0-1背包问题”----国王和金矿问题----C++实现】

    } else { Result[j] = max(preResult[j],preResult[j-p[i]]+G[i]); } } for (int i = 0; i w; i++) { cout Result[i]\\\" \\\"; preResult[i] = Result[i];//计算完一行计算下一行 结果变成上一行的结果 //cout preResult[i]; } cout endl; } return Result[w-1]; } int main() { int p[5] = { 5,5,3,4,3 }; int Result; int n = 5; int w = 10; int G[5] ={400,500,200,30

    2024年04月26日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包