当前位置: 代码迷 >> 综合 >> 剪剪剪 1024
  详细解决方案

剪剪剪 1024

热度:76   发布时间:2023-12-06 03:45:49.0

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,但其实去想下可不可以跳过不必要的运算,然后去写条件就行。

  相关解决方案