首页 > 其他分享 >P1080 [NOIP2012 提高组] 国王游戏

P1080 [NOIP2012 提高组] 国王游戏

时间:2025-01-09 22:55:39浏览次数:1  
标签:const NOIP2012 int len times 大臣 P1080 Data 游戏

P1080 [NOIP2012 提高组] 国王游戏

题目

恰逢 H 国国庆,国王邀请 \(n\) 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 \(n\) 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。

国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。

输入

第一行包含一个整数 \(n\),表示大臣的人数。

第二行包含两个整数 \(a\) 和 \(b\),之间用一个空格隔开,分别表示国王左手和右手上的整数。

接下来 \(n\) 行,每行包含两个整数 \(a\) 和 \(b\),之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。

输出

一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

样例

输入

3 
1 1 
2 3 
7 4 
4 6

输出

2

提示

【输入输出样例说明】

按 \(1\)、\(2\)、\(3\) 这样排列队伍,获得奖赏最多的大臣所获得金币数为 \(2\);

按 \(1\)、\(3\)、\(2\) 这样排列队伍,获得奖赏最多的大臣所获得金币数为 \(2\);

按 \(2\)、\(1\)、\(3\) 这样排列队伍,获得奖赏最多的大臣所获得金币数为 \(2\);

按$ 2$、\(3\)、$1 $这样排列队伍,获得奖赏最多的大臣所获得金币数为 \(9\);

按 \(3\)、\(1\)、$2 $这样排列队伍,获得奖赏最多的大臣所获得金币数为 \(2\);

按$ 3$、\(2\)、\(1\) 这样排列队伍,获得奖赏最多的大臣所获得金币数为 \(9\)。

因此,奖赏最多的大臣最少获得 \(2\) 个金币,答案输出 \(2\)。

【数据范围】

对于 \(20\%\) 的数据,有 \(1≤ n≤ 10,0 < a,b < 8\);

对于 \(40\%\) 的数据,有$ 1≤ n≤20,0 < a,b < 8$;

对于 \(60\%\) 的数据,有 \(1≤ n≤100\);

对于 \(60\%\) 的数据,保证答案不超过 \(10^9\);

对于 \(100\%\) 的数据,有 \(1 ≤ n ≤1,000,0 < a,b < 10000\)。


思路

对于国王身后的两个大臣进行分析,第一种情况:

国王 \(a_0\) \(b_0\)
\(p_1\) \(a_1\) \(b_1\)
\(p_2\) \(a_2\) \(b_2\)

第一种情况答案为 \(\max(a_0/b_1,(a_0 \times a_1)/b _ 2)\)。

\(p_1,p_2\) 换一下位置,第二种情况:

国王 \(a_0\) \(b_0\)
\(p_1\) \(a_2\) \(b_2\)
\(p_2\) \(a_1\) \(b_1\)

第二种情况答案为 \(\max(a_0/b_2,(a_0 \times a_2)/b_1)\)。

比较

\[a_0/b_1,(a_0 \times a_1)/b_2,a_0/b_2,(a_0 \times a_2)/b_1 \]

这四项,其中

\[(a_0 \times a_1)/b_2>a_0/b_2,(a_0 \times a_2)/b_1>a_0/b_1 \]

那么问题转换为比较

\[(a_0 \times a_1)/b_2 \]

\[(a_0 \times a_2)/b_1 \]

这两项的值。如果 \(p_1\) 排在前面答案更大,就说明

\[(a_0 \times a_1)/b_2>(a_0 \times a_2)/b_1 \]

\[a_1 \times b_1>a_2 \times b_2 \]

同理如果 \(p_2\) 排在前面答案更大,就说明

\[a_1 \times b_1<a_2 \times b_2 \]

所以为了使答案取到最小值,我们需要将 \(a_i \times b_i\) 较小的放在前面,那么以 \(a_i \times b_i\) 为关键字排序即可。之后依次比较当前大臣前面的所有人左手上的数的乘积除以他自己右手上的数,并向下取整得到的结果,取最大值。由于 \(1 \le n \le 1000,0<a,b<10000\),左手上的数的乘积最大值为 \(10000^{10}=(10^4)^{10}\),结果达到 \(4000\) 位,远远超过 \(\operatorname{long long}\) 范围,因此需要使用高精度运算。


代码

#include <bits/stdc++.h>

using namespace std;

const int N = 4005;

struct Node
{
	int l, r;
	Node() // 结构体初始化
	{
	}
	Node(int x, int y) : l(x), r(y) // 结构体初始化
	{
	}
	bool operator < (const Node &x) const
	{
		return l * r < x.l * x.r;
	}
} a[N];

struct Data
{
	int s[N], len;
	Data() // 初始化
	{
		memset(s, 0, sizeof(s));
		len = 1;
	}
	Data(int x) // 初始化
	{
		memset(s, 0, sizeof(s));
		len = 1;
		int i = 0;
		while (x)
		{
			s[++ i] = x % 10;
			x /= 10;
		}
		len = i;
	}
} ans;

Data operator * (const Data &a, const int &b) // 高精度 * 单精度
{
	Data c;
	c.len = a.len;
	for (int i = 1; i <= c.len; i ++ )
	{
		c.s[i] += a.s[i] * b;
		c.s[i + 1] += c.s[i] / 10;
		c.s[i] = c.s[i] % 10;
	}
	if (c.s[c.len + 1])
	{
		int x = c.s[c.len + 1], len = c.len;
		while (x)
		{
			c.s[++ len] = x % 10;
			x /= 10;
		}
		c.len = len;
	}
	return c;
}

Data operator / (const Data &a, const int &b) // 高精度除以低精度
{
	Data c;
	c.len = a.len;
	int x = 0;
	for (int i = c.len; i >= 1; i -- )
	{
		x = x * 10 + a.s[i];
		c.s[i] = x / b;
		x %= b;
	}
	while (!c.s[c.len] && c.len > 1)
		c.len --; // 去掉前导零
	return c;
}

bool operator < (const Data &a, const Data &b) // 重载 < 号
{
	if (a.len == b.len)
	{
		int i;
		for (i = a.len; a.s[i] == b.s[i] && i > 1; i -- );
		if (i >= 1)
			return a.s[i] < b.s[i];
		else
			return 0;
	}
	else
		return a.len < b.len;
}

void print(const Data &a)
{
	for (int i = a.len; i >= 1; i -- )
		printf("%d", a.s[i]);
}

int n, x, y;

int main()
{
	scanf("%d", &n);
	for (int i = 0; i <= n; i ++ )
	{
		scanf("%d %d", &x, &y);
		a[i] = Node(x, y);
	}
	sort(a + 1, a + n + 1);
	Data k(1);
	for (int i = 1; i <= n; i ++ )
	{
		if (a[i - 1].l == 0) // 判 0
			break;
		k = k * a[i - 1].l;
		Data temp; // 注意被除数用 temp 存下来
		temp = k / a[i].r;
		if (ans < temp)
			ans = temp;
	}
	print(ans);
	return 0;
}

标签:const,NOIP2012,int,len,times,大臣,P1080,Data,游戏
From: https://www.cnblogs.com/IronMan-PZX/p/18663032

相关文章

  • RaceGame-Qt游戏项目构建-游戏框架
    RaceGame-Qt游戏项目构建-游戏框架游戏企划使用Qt图形化界面开发一款名为RaceGame的小游戏,游戏玩法是4方玩家(方块)在带有墙体的地图中以一定速度、一定方向前进,碰到墙体会反弹,最终玩家按照到达目的地的先后顺序排名。游戏过程中,玩家可以通过界面上的Button按钮进行释放技能,......
  • AI 助力游戏开发实践-有限状态机
    引言在数字娱乐产业中,游戏开发无疑是最具活力和创新性的领域之一。随着技术的进步和玩家需求的日益增长,游戏开发者面临着前所未有的挑战和机遇。游戏不仅要在图形和玩法上不断创新,还要提供流畅的用户体验和智能的游戏逻辑。在这样的背景下,有限状态机(FSM)成为了游戏开发中一个不可......
  • flask框架网络游戏虚拟交易平台毕设源码+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于网络游戏虚拟交易平台的研究,现有研究多集中在网络游戏的整体运营、玩家行为分析等方面,专门针对网络游戏虚拟交易平台的研究较少。......
  • 用java做一个有关方块切换的小游戏
    闲暇时间利用自己所写的知识写了一个简单的小游戏,该游戏我暂且叫它方块切换,玩法也很简单,大致是,点击一个方格,然后这个方格以及它相邻的方格都会在黑白色中切换,获胜条件就是把所有的黑色块变为白色块就算赢了。以下是游戏效果图:具体实现代码如下:SwitchBlock类代码importja......
  • 【游戏设计原理】53 - 解决问题的障碍
    1.分析并总结原理核心观点游戏本质是一系列问题解决的过程,通过设计巧妙的问题和决策场景,游戏能激发玩家的兴趣和投入感。然而,当问题解决的过程被阻碍时,会降低玩家的体验甚至让他们放弃游戏。文中提到的四种障碍反映了玩家在面对复杂问题时可能遇到的心理和认知问题:功能......
  • 最新游戏产业报告显示相关市场暴涨99%,业内人士:云电脑畅玩已成流行趋势
            根据游戏工委《2024年中国游戏产业报告》统筹调研显示,2024年国内小程序游戏市场收入达到398.36亿元,同比增长高达99.18%,涨幅惊人;电子竞技游戏市场实际销售收入增长率则达7.52%,如《黑神话:悟空》《和平精英:地铁逃生》《无限暖暖》等新兴游戏有效激活主机市场潜力......
  • 【Unity 低多边形卡通风格资源包】Cartoon Low Poly Cube World 提供了一整套低多边形
    CartoonLowPolyCubeWorld是一款为Unity开发者设计的资源包,旨在帮助开发者快速构建一个低多边形风格的卡通世界。该插件提供了一整套低多边形的场景元素、建筑、角色和道具,使得开发者能够以一种简单、直观的方式创建充满趣味和色彩的卡通游戏世界。主要特点丰富的低......
  • 数字猜猜小游戏
      游戏中首先使用随机对象产生一个1~100之间的整数,当用户单击“开始”按钮时,动态生成100个按钮,并开始计时,如果用户单击的数字大于随机数,那么被单击的按钮变为红色,并显示字符串“大”:如果用户单击的数字小于随机数,那么被单击的按钮变为红色,并显示字符串“小”:如果单击的数字......
  • 【unity】学习制作2D横板冒险游戏-1-
    创建项目2D(Built-InRenderPipeline)核心模板为2D游戏开发提供基础架构。配置了适合2D项目的纹理导入、SpritePacker、Scene视图、光照和正交摄像机等设置。3D(Built-InRenderPipeline)核心模板开启3D游戏开发之旅,提供强大的3D场景构建能力。配置了使用Unity内置渲染管......
  • Java实现《七星传说》游戏开发详解
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......