【ybtoj 高效进阶 1.2】D.国王游戏【贪心】

20 篇文章 0 订阅

在这里插入图片描述
在这里插入图片描述

分析

ans1=max ( l0 / r1,l0 * l1 / r2 )
ans2=max ( l0 / r2,l0 * l2 / r1 )
可以比较得出
l0 / r1 < l0 * l2 / r1
l0 / r2 <l0 * l1 / r2
假设ans1<ans2
那么l0 * l1 / r2 < l0 * l2 / r1
使用八年级分式方程的解法得出
l1 * r1 < l2 * r2
快排之后求答案

记得加高精度

上代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n,c,t,l;
int sum[10001],d[10001],ans[10001];

struct node
{
	int l,r;
}a[2001];

int cmp(node l,node y)
{
	return l.l*l.r<y.l*y.r;
}

void jq(int x)
{
	int w=0;
    for(int i=1;i<=l;i++)
	{
	 	sum[i]=sum[i]*x+w;
	 	w=sum[i]/10;
	 	sum[i]=sum[i]%10;
	} 
	while(w)
	{
	    sum[++l]=w%10;
	    w=w/10;
	} 
}

void div(int x)
{
	int w=0;
	c=1;
	memset(d,0,sizeof(d));
	for(int i=l;i>0;i--)
	{
	 	w=w*10+sum[i];
	 	d[i]=w/x;
	 	if(d[i]!=0&&c==1) c=i;
	 	w=w%x;
	} 
}

int pd()
{
	if(t>c) return 0;
	if(c>t)
	{
		t=c;
		return 1;
	}
	for(int i=1;i<=t;i++)
	{
		if(ans[i]<d[i]) return 1;
	}
	return 0;
}

int main()
{
	cin>>n;
	l=1;
	sum[1]=1;
	for(int i=0;i<=n;i++)
	{
		cin>>a[i].l>>a[i].r;
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	{
		jq(a[i-1].l);
		div(a[i].r);
		if(pd())
		{
			for(int i=1;i<=t;i++)
			{
				ans[i]=d[i];
			}
		}
	}
	for(int i=t;i>=1;i--)
	{
		cout<<ans[i];
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值