概述
这道题讲真还是挺友好的,纯暴力拿了50分。
当时我选择第一道题去搞他,第一反应是二分答案,毕竟理论上每次考试都有一道水题,然而仔细想想便可知不靠谱,然后就打了一个倒着搜的暴力,懵逼到结束。
这道题当时预测是一道数学题,然而看完题解发现,貌似是乱搞……我反正是不知道如何归类了。
假设我们已经知道当前的d,那么我们的答案也就出来了:
num=∑(┍a[i]/d┑*d-a[i])
那么只要num<=k就一定成立了,那么我们令sum=k+∑a[i]
那么我们会得到一个有趣的式子∑┍a[i]/d┑*d<=sum显然,┍a[i]/d┑是一个递减的分段函数,那么我们把它除过去,便可以知道当前d的最大可行取值。那么如何去找函数的每一段呢?我们设函数左端点为l,右端点为r,r=sum/(sum/l),很神奇,但貌似不太好证,总之是对的。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #include<algorithm> 7 #include<cmath> 8 #define N 105 9 using namespace std; 10 long long n,m; 11 long long a[N]; 12 long long sum,ans; 13 int main() 14 { 15 scanf("%lld%lld",&n,&m); 16 for(int i=1;i<=n;i++) 17 { 18 scanf("%lld",&a[i]); 19 sum+=a[i]; 20 } 21 sum+=m; 22 long long d=0; 23 while(1) 24 { 25 if(sum/(d+1)<=0)break; 26 d=sum/(sum/(d+1)); 27 long long an=0; 28 for(int i=1;i<=n;i++) 29 { 30 long long tt=a[i]/d; 31 if(a[i]%d) tt++; 32 an+=tt*d; 33 } 34 if(an<=sum) ans=d; 35 } 36 printf("%lldn",ans); 37 return 0; 38 }
转载于:https://www.cnblogs.com/liutianrui/p/7528352.html
最后
以上就是洁净樱桃为你收集整理的9.14 砍树题解的全部内容,希望文章能够帮你解决9.14 砍树题解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复