COGS 2188. [HZOI 2015] Math 题解

 

题目描述:

给定n个数X1-Xn,求下面式子的值(整数部分):

n<=107,xi<=109且互不相同。

分析:

其实一开始看见这道题我也吓傻了,k这么大,再说我又是数论鶸渣,打死也不会= =

后来看了各路神犇的题解,又仔细想了想,大概明白了。

首先,k这么大,已经不是高精乘和高精开方所能承受的了(当然,你也可以找个超级计算机算算试试)

所以我们可以把k视为∞(INF)。

极限思想,由于xi互不相同,所以每个元素在比它稍微大一点点的数面前都是微乎其微,不会影响到整数部分的。

(可以粗略验证,=101001e+100,9100=2.6561398887587476933878132203578e+95,差了5个数量级,在10100  面前9100可以忽略不计(毕竟只取整数嘛))

(或者直接算,100√10100 + 9100=10.00000265610496673245179467499,整数部分还是10

也就是说,在k=INF的情况下,上述式子的整数部分即为

max{xi

这么分析过后,题目就迎刃而解了。

贴出c++参考代码:(0.388 s,0.14 MB)

 

#include<cstdio>
int MAIN();
int n,temp=0,x=MAIN();
inline void read(int &x){//不用快读是上不了榜的
	x=0;int c=getchar();
	while(c<'0'||c>'9')c=getchar();
	for(;c>='0'&&c<='9';c=getchar())x=(x<<1)+(x<<3)+(c^48);
	return;
}
int main(){;}
inline int MAIN(){//减小常数,闲的没事者专用
	freopen("math.in","r",stdin);
	freopen("math.out","w",stdout);
	read(n);
	for(int i=0;i<n;i++){
		read(x);
		if(x>temp)temp=x;
	}
	return printf("%d",temp);
}

 

posted @ 2016-03-28 06:35  AntiLeaf  阅读(425)  评论(0编辑  收藏  举报