洛谷 P1080 [NOIP2012 提高组] 国王游戏

一道非常有挑战性的题目(~太难了~)。

这题我们可以用贪心来做。

思路:

  1. 首先我们定义一个结构体 struct,里面放的是每个人左手和右手的数字。
  2. 接着我们需要一种排列方式,使得获得奖赏最多的大臣,所获奖赏尽可能的少;这句话听起来是不是听绕口?意思就是说得到奖赏数量最多,但加起来的总奖赏和最少;因此,我们可以定义一个自定义排序 cmp,使 a.l*a.r<b.l*b.r。
  3. 我们可以在定义两个 vector 数组 ans 和 t,ans 第 0 个值初始化成0,t 第 0 个值初始化成 1。
  4. 随后是高精度乘低精度和高精度除以低精度的函数。
  5. 最后再定义一个函数 compare,用来比较大小。
  6. 输入,注意:要先输入 f[0].l 和 f[0].r,表示国王的左手和右手。

AC CODE:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
struct stu{
	int l;
	int r;
}f[1005];
bool cmp(stu a,stu b){
	return a.l*a.r<b.l*b.r;
}
int n;
vector<int> ans(1,0);
vector<int> t(1,1);
inline vector<int> mul(vector<int> &a,int b){
	vector<int> res;
	int t = 0;
	int len = a.size();
	for(int i=0;i<len;i++){
		t+=a[i]*b;
		res.push_back(t%10);
		t/=10;
	}
	while(t){
		res.push_back(t%10);
		t/=10;
	}
	return res;
}
inline vector<int> div(vector<int> &a,int b){
	vector<int> res;
	int r = 0;
	int len = a.size();
	for(int i=len-1;i>=0;i--){
		r = 10*r+a[i];
		if(r>=b){
			res.push_back(r/b);
			r%=b;
		}else{
			res.push_back(0);
		}
	}
	vector<int> cnt;
	len = res.size();
	for(int i=len-1;i>=0;i--){
		cnt.push_back(res[i]);
	}
	while((cnt.back()==0)&&(cnt.size()>1)){
		cnt.pop_back();
	}
	return cnt;
}
inline int compare(vector<int> &a,vector<int> &b){
	int lenA = a.size();
	int lenB = b.size();
	if(lenA!=lenB){
		int t = lenA-lenB;
		return t;
	}else{
		for(int i=lenA-1;i>=0;i--){
			if(a[i]!=b[i]){
				int t = a[i]-b[i];
				return t;
			}
		}
		return 0;
	} 
}
int main(){
	cin>>n;
	cin>>f[0].l>>f[0].r;
	for(int i=1;i<=n;i++){
		cin>>f[i].l>>f[i].r;
	}
	sort(f+1,f+1+n,cmp);
	t = mul(t,f[0].l);
	for(int i=1;i<=n;i++){
		vector<int> res = div(t,f[i].r);
		if(compare(ans,res)<0){
			ans = res;
		}
		t = mul(t,f[i].l);
	}
	int len = ans.size();
	for(int i=len-1;i>=0;i--){
		cout<<ans[i];
	}
	cout<<endl;
	return 0;
}
相关推荐
2501_941805933 天前
一次从接口网关到异步消息驱动架构演化的互联网系统实践技术随笔分享录
leetcode·决策树·贪心算法
2501_941664963 天前
面向微服务分布式队列与异步流量削峰的互联网系统高可用设计与多语言工程实践分享
leetcode·贪心算法
汉克老师5 天前
GESP2025年12月认证C++五级真题与解析(编程题2 (相等序列))
c++·算法·贪心算法·中位数·质数分解
冰西瓜6005 天前
贪心(四)——拟阵 算法设计与分析 国科大
算法·贪心算法
长安er5 天前
LeetCode121/55/45/763 贪心算法理论与经典题解析
java·数据结构·算法·leetcode·贪心算法·贪心
汉克老师6 天前
GESP2025年12月认证C++五级真题与解析(判断题1-10)
c++·链表·贪心算法·排序·gesp5级·gesp五级
前端小L7 天前
贪心算法专题(十三):画地为牢的艺术——「划分字母区间」
javascript·算法·贪心算法
Coder_Boy_7 天前
基于SpringAI的智能AIOps项目:部署相关容器化部署管理技术图解版
人工智能·spring boot·算法·贪心算法·aiops
前端小L7 天前
贪心算法专题(十):维度权衡的艺术——「根据身高重建队列」
javascript·算法·贪心算法
冰西瓜6007 天前
贪心(一)——从动态规划到贪心 算法设计与分析 国科大
算法·贪心算法·动态规划