我是靠谱客的博主 洁净樱桃,最近开发中收集的这篇文章主要介绍9.14 砍树题解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  这道题讲真还是挺友好的,纯暴力拿了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 }
View Code

 

转载于:https://www.cnblogs.com/liutianrui/p/7528352.html

最后

以上就是洁净樱桃为你收集整理的9.14 砍树题解的全部内容,希望文章能够帮你解决9.14 砍树题解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部