好像是spoj的eko问题...
1)对树木的高度进行排序。2)减去a[i](较大的高度)-a[j](较小的高度树)乘以考虑到尚未被切割的总树...
有关如何工作的更多详细信息,请查看代码
#define gu getchar();
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int scan()
{
int n=0;
char ch=gu;
while(ch<48){ch=gu;}
while(ch>47){n=(n<<3)+(n<<1)+ch-'0';ch=gu;}
return n;
}
bool dec(ll i,ll j)
{
return (i>j);
}
ll a[1000000]={0};
int main()
{
int n,i;
ll l,m;
scanf("%d %lld",&n,&m);
for(int i=0;i<n;i++)
scanf("%lld",a+i);
sort(a,a+n,greater<ll>());
//for(int i=0;i<n;i++)
// printf("%lld ",a[i]);
ll k=a[0];
for(i=1;i<n;i++)
{
//printf("*%lld ",m);
if(a[i]==k)
continue;
if((m-((i)*(k-a[i])))<=0)
{
if((m-((i)*(k-a[i])))==0)
{printf("%d\n",a[i]);break;}
else
{
ll z=(ll)(m/(i+1));
m=m-z*(i);
if(m==0)
{printf("%lld\n",k-z);break;}
if(m-(i+1)<0)
{printf("%lld\n",k-z-1);break;}
}
printf("%lld ",m);
}
m=m-((i)*(k-a[i]));
k=a[i];
}
return 0;
}