Description
喜爱剪东西的Muin喜欢剪纸。这是一个对Muin来说很开心的事情,但是她的剪刀比较奇葩且她的爱好比较独特,她的剪刀不会完全的去剪一张纸。她的剪刀可以设置一个长度参数H(cm),例如,如果一叠纸的长度分别为20,15,10和17,Muin把剪刀设置到15cm的长度,裁剪后纸片剩下的长度将是15,15,10和15,Muin共得到7cm长度的纸。Muin又为了有趣,不愿意浪费纸张,所以她希望找到剪刀的最大的整数长度H,使得她能得到纸张至少为Mcm。换句话说,如果H再升高1cm,她将得不到Mcm纸。
但是Muin又比较逗,自己算不出来,所以希望你帮助她找到这个H。
Input
测试数据有多组,对于每组测试数据:
第1行:2个整数N和M,N表示纸片的数量(1<=N<=100000),M表示需要的纸张总长度(1<=M<=200000000)
第2行:N个整数表示每张纸的长度,值均不超过200000000。数据保证所有纸张长度之和大于M,因此必有解。
Output
对于每组测试数据,输出对应的H并换行。
Samples
input Copy
5 20 4 42 40 26 46
output Copy
36
#include <stdio.h>
int w[100001]={0};
int main(void)
{
int i,j;
int max=0;
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(i=0;i<n;++i)
{
scanf("%d",&w[i]);
if(w[i]>max)
max=w[i];//读的时候就把最大值给记录
}
for(j=max-(m/n);;)//想下其实不用以1递减,如果他的每个元素平均下来,大于1等于的话,那其实可以假设
{ //每个元素都是最大值,反正不满足条件就下次循环,然后如果他是小于1的话,就不能
int t=0; //简单的当作最大值来看了,因为,有些是不满足条件的,会跳过答案,只要一个个减,就
for(i=0;i<n;++i)//可以了。
{
if(w[i]>j)
t+=w[i]-j;
}
if(t>=m)
break;
if(((m-t)/n)>=1)
j=j-(m-t)/n;
else
j--;
}
printf("%d\n",j);
}
return 0;
}
//总的来说这是一道思维题,就是要去想出题者为什么要把条件限制的这么苛刻,一般都着,两个for就走人,厉害点,用c++里的map,但其实去想下可不可以跳过不必要的运算,然后去写条件就行。