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

[NOIP2012 提高组] 国王游戏 题解

时间:2024-11-10 17:46:10浏览次数:3  
标签:res NOIP2012 int dfrac xa len 题解 bigg 游戏

[NOIP2012 提高组] 国王游戏

典贪心。设当前点为 \(i\),\(\prod_{k=0}^{i-1}a_k\) 为 \(x\),则对于 \(i,j\) 两点的答案:(为了方便,记 \(i+1=j\))

\[\mathit{res}_1=\max\bigg(\dfrac x{b_i},\dfrac{xa_i}{b_j}\bigg)~; \]

若交换,则:

\[\mathit{res}_2=\max\bigg(\dfrac x{b_j},\dfrac{xa_j}{b_i}\bigg)~. \]

假设不交换更大,则:

\[\max\bigg(\dfrac x{b_i},\dfrac{xa_i}{b_j}\bigg)>\max\bigg(\dfrac x{b_j},\dfrac{xa_j}{b_i}\bigg) \]

显然两个 \(\max\) 满足对称性,不妨设 \(\dfrac x{b_i}<\dfrac{xa_i}{b_j}\)。又因为都是正整数,所以 \(\dfrac{xa_i}{b_j}>\dfrac x{b_j}\)。那么使该式成立当且仅当

\[\dfrac{xa_i}{b_j}>\dfrac{xa_j}{b_i}~. \]

消去 \(x\),移项,就得到:

\[a_ib_i>a_jb_j~. \]

因为国王要求答案最小,所以按照 \(a_ib_i<a_jb_j\) 来排序之后统计答案即可。

高精度去死!

#include<bits/stdc++.h>
#define fw fwrite(obuf,p3-obuf,1,stdout)
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
#define putchar(x) (p3-obuf<1<<20?(*p3++=(x)):(fw,p3=obuf,*p3++=(x)))
using namespace std;

char buf[1<<20],obuf[1<<20],*p1=buf,*p2=buf,*p3=obuf,str[20<<2];
int read(){
	int x=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return x;
}
template<typename T>
void write(T x,char sf='\n'){
	if(x<0)putchar('-'),x=~x+1;
	int top=0;
	do str[top++]=x%10,x/=10;while(x);
	while(top)putchar(str[--top]+48);
	if(sf^'#')putchar(sf);
}
constexpr int MAXN=1005;
int n;
struct P{
	int a,b;
	bool operator<(const P&x)const{
		return a*b<x.a*x.b;
	}
}p[MAXN];
struct BIG{
	int s[MAXN<<2],len;
	BIG(){
		memset(s,0,sizeof(s));
		len=0;
	}
	BIG operator=(int x){
		BIG res;
		do res.s[++res.len]=x%10,x/=10;while(x);
		return *this=res;
	}
	BIG(int x){
		*this=x;
	}
	bool operator<(const BIG&x)const{
		if(len^x.len) return len<x.len;
		for(int i=x.len;i;--i)
			if(s[i]^x.s[i])
				return s[i]<x.s[i];
		return 0;
	}
	void upd(){
		while(len>1&&!s[len]) --len;
	}
	BIG operator*(const BIG&x)const{
		BIG res;
		int l=len+x.len;
		for(int i=1;i<=len;++i)
			for(int j=1;j<=x.len;++j)
				res.s[i+j-1]+=s[i]*x.s[j];
		for(int i=1;i<=l;++i)
			if(res.s[i]>9)
				res.s[i+1]+=res.s[i]/10,res.s[i]%=10;
		res.len=l,res.upd();
		return res;
	}
	BIG operator/(const int&x)const{
		BIG res;
		int tmp=0,l=len;
		for(int i=l;i;--i){
			tmp=(tmp<<3)+(tmp<<1)+s[i];
			while(tmp>=x) res.s[i]+=tmp/x,tmp%=x;
		}
		res.len=l,res.upd();
		return res;
	}
	void write(){
		for(int i=len;i;--i) putchar(s[i]+48);
		putchar('\n');
	}
};

int main(){
	n=read();
	for(int i=0;i<=n;++i) p[i]={read(),read()};
	sort(p+1,p+n+1);
	BIG res=0,lhs=p[0].a;
	for(int i=1;i<=n;++i){
		res=max(res,lhs/p[i].b);
		lhs=lhs*p[i].a;
	}
	res.write();
	return fw,0;
}

标签:res,NOIP2012,int,dfrac,xa,len,题解,bigg,游戏
From: https://www.cnblogs.com/laoshan-plus/p/18538261

相关文章

  • [luogu1248] 加工生产调度 题解
    考虑\(i\)排在\(j\)前的条件是\(a_i+\max(a_j,b_i)+b_j\lea_j+\max(a_i,b_j)+b_i\),然后发现这一坨东西是皇后游戏中的倒数第三个式子,直接转化为\(\min(a_j,b_i)\ge\min(a_i,b_j)\),然后就按皇后游戏中的排序方法就可以了……#include<bits/stdc++.h>#defineintlonglong......
  • [luogu1248] 加工生产调度 题解
    考虑\(i\)排在\(j\)前的条件是\(a_i+\max(a_j,b_i)+b_j\lea_j+\max(a_i,b_j)+b_i\),然后发现这一坨东西是皇后游戏中的倒数第三个式子,直接转化为\(\min(a_j,b_i)\ge\min(a_i,b_j)\),然后就按皇后游戏中的排序方法就可以了……#include<bits/stdc++.h>#defineintlonglong......
  • [luogu1248] 加工生产调度 题解
    考虑\(i\)排在\(j\)前的条件是\(a_i+\max(a_j,b_i)+b_j\lea_j+\max(a_i,b_j)+b_i\),然后发现这一坨东西是皇后游戏中的倒数第三个式子,直接转化为\(\min(a_j,b_i)\ge\min(a_i,b_j)\),然后就按皇后游戏中的排序方法就可以了……#include<bits/stdc++.h>#defineintlonglong......
  • CCPC 网络赛题解(D/I/J)
    D根据题目给出的构造方式,\(S_n'\)的长度会达到\(2^n\)数量级,没法求出\(S_n'\),所以考虑递推。设\(dp_{i,l,r}\)为\(S_i'\)里\(T\)的\([l,r]\)区间以子序列的方式出现了多少次,可以写出转移方程:\(dp_{i,l,r}=\sumdp_{i-1,l,k}\cdotdp_{i-1,k+1,r}+[a_i=T_k]\cdot......
  • [JXOI2017] 加法 题解
    最小值最大,考虑二分答案,问题转为判断最小值是否能\(\gex\)。假如\(a_i\gex\),那我们肯定不管;假如\(a_i<x\),那最好能让选择的区间\(r\)值更大,用优先队列维护即可。区间增幅可以用树状数组维护。时间复杂度\(O(n\log^2n)\)。#include<bits/stdc++.h>#defineintlonglon......
  • [luogu2123] 皇后游戏
    那她既然都说到老国王了,那肯定就是贪心了。先声明两个引理:引理1:若\(\max(c,a)<\max(c,b)\)时,定有\(a<b\)。引理2:\(\max(a,b)-a-b=-\min(a,b)\)。证明就不说了,非常好证。考虑\(i,j\)两大臣孰先孰后,假如\(i\)在前面更优,\(x\)表示所有在他们前面的大臣的\(\suma\)......
  • [CF1981E] Turtle and Intersected Segments 题解
    好题好题。难点在建图,因为图的边数将会决定最小生成树的时间复杂度。我们肯定希望能够只建\(O(n)\)级别的边,这样时间复杂度就可以做到\(O(n\logn)\)。观察到当\(i,j,k\)三个区间能够互相连边时(这里假设\(a_i<a_j<a_k\)),我们绝对不会连\((i,k)\)这条边。那么假如我们将......
  • [CF1981E] Turtle and Intersected Segments 题解
    好题好题。难点在建图,因为图的边数将会决定最小生成树的时间复杂度。我们肯定希望能够只建\(O(n)\)级别的边,这样时间复杂度就可以做到\(O(n\logn)\)。观察到当\(i,j,k\)三个区间能够互相连边时(这里假设\(a_i<a_j<a_k\)),我们绝对不会连\((i,k)\)这条边。那么假如我们将......
  • 在鸿蒙NEXT中开发一个2048小游戏
    本项目是基于api12开发的2048游戏,游戏的逻辑是当用户向某个方向滑动时,将该方向相邻且相等的数字相加,同时在空白区域的随机位置生成一个随机数字。游戏中的数字越大,分数越高。  首先,游戏的界面布局分别采用两个网格组件Grid来实现,难点在于上方的菜单栏是不均等的三种尺寸的组......
  • 如何简化App Store提现?——作为游戏开发者的跨境收款体验分享
    目录如何简化AppStore提现?——作为游戏开发者的跨境收款体验分享跨境收款常见的几个问题使用万里汇收款后的体验1.结算流程简单,到账更快2.多场景收付更灵活3.多种支付方式支持使用后的效果:资金管理更高效个人建议如何简化AppStore提现?——作为游戏开发者的跨......