P8507 毕业后-题解

2022.9.8 18:13 修改了部分错别字。

考场蒙了 2020 分,看完 5ab 的讲解才会的

题意

给你两个正整数 a,ba,b1a,b100001\le a,b \le 10000,让你求使得 bxba\lceil bx\rceil\le\frac{b}{a} 的最大 xx

解法

题意已经讲得很清楚了,就是解这个方程了。

暴力枚举? 这显然不行。

所以我们看一下面的式子:

xyxy\lceil x\rceil\le y\Leftrightarrow x\le\lfloor y\rfloor

这个式子的意思是如果 xy\lceil x\rceil\le y,则 xyx\le\lfloor y\rfloor

证明

考虑反证法,也就是如果 xy\lceil x\rceil\le y,而 x>yx\gt\lfloor y\rfloor

x>yx\gt\lfloor y\rfloor 可得 xy\lfloor x\rfloor\ge\lfloor y\rfloor

那么 x\lceil x\rceil 一定会比 yy 大,矛盾,所以命题成立。

就这我们就可以把 bxba\lceil bx\rceil\le\frac{b}{a} 变成 xabbx\le\frac{\lfloor\frac{a}{b}\rfloor}{b}

这样我们只要求 abb\frac{\lfloor\frac{a}{b}\rfloor}{b} 即可。

代码

#include<bits/stdc++.h>
using namespace std;
int a,b;
inline int read(){
   int x=0;
	bool flag=0;
   char ch=getchar();
   if(ch=='-'){
    	flag=1;
	}
   while(ch<'0'||ch>'9'){
      ch=getchar();
	}
   while(ch>='0'&&ch<='9'){
   		x*=10,x+=ch-'0',ch=getchar();
	}
   if(flag) return -x;
   return x;
}
int main(){
	a=read(),b=read();
	printf("%.10f\n",1.0*ci(b/a)/b);
	return 0;
}
posted @ 2022-09-07 19:33  fengxiaoyi  阅读(16)  评论(0)    收藏  举报  来源