题解(3)

----------------------------------- -华丽丽的题解分割线------------------------------------------------------

1.   毛烨超的IQ

   题目大意:(咳咳,我们可爱的毛毛)给我们两串数列,并保证a数列的平均值比b数列的平均值大,让我们求有几个数从a数列丢到b数列时,可以使a数列与b数列的平均值都上升。

不可信的样例君:

不可信.in

不可信.out

3

3 2 3

3

3 2 5

1

 做法分析:就是求平均值啊。。。。。笔算都能算。。。。。按照道理来说。。。。。是一定要A的题啊(然而我没A,30分。。心情咸鱼)

咳咳,日常附代码:

#include<bits/stdc++.h>

using namespace std;

int a[1000]={},b[1000]={};

int main()

{

    intn,m,s=0,k=0,t1=0,t2=0;

    doublesa=0,sb=0;

    cin>>m;

    for(inti=1;i<=m;i++)

     {

         cin>>b[i];

         t2+=b[i];

     }

    sb=t2*1.0/(m*1.0);//*1.0是为了

    cin>>n;

    for(inti=1;i<=n;i++)

     {

         cin>>a[i];

         t1+=a[i];

     }

     sa=t1*1.0/(n*1.0);

    for(inti=1;i<=n;i++)

     {

         if(a[i]<t1*1.0/double((n-k)*1.0)&&a[i]>t2*1.0/double((m+k)*1.0))

         {

          k++;

          t1-=a[i];

          t2+=a[i];

          s++;

        }

     }

    cout<<s;

    return 0;

}

(送分题已过,下一题下一题)

 2.黄旭彬家的工厂

 题目大意:有n个部件需要在A、B机器上加工,每个工件都必须经过先A后B两道工序。已知:部件i在A、B机器上的加工时间分别为ai,bi。求最短加工时间。

 【输入输出样例】

prod.in

prod.out

5

3 5 8 7 10

6 2 1 4 9

34

 解题思路:很明显,这是一道贪心题。那么解体的重点就是贪心标准了。因为每个工件一定要先A后B,所以我们想要最短就应该让在A处加工越短的越先做,且A和B两道工序要尽量同时在运作,那么贪心标准就出来了。

 代码如下:

#include<bits/stdc++.h>

usingnamespace std;

structad

{

      int x,y;

}m[1010];

bool cmp(ad p,ad q)

{

      return p.x<q.x;

}

int main()

{

      int n,sum=0,l,r,la;

      int a[1010],b[1010],f[1010];

      cin>>n;

      for(int i=1;i<=n;i++)

        cin>>a[i];

      for(int i=1;i<=n;i++)

        cin>>b[i];

      for(int i=1;i<=n;i++)

      {

          if(a[i]<b[i]) m[i].x=a[i];else m[i].x=b[i];

          m[i].y=i;

    }

    sort(m+1,m+n+1,cmp);

      l=1;r=n;

      for(int i=1;i<=n;i++)

      if(m[i].x==a[m[i].y]) f[l++]=m[i].y;else f[r--]=m[i].y;

      la=0;

      for(int i=1;i<=n;i++)

      {

            if(la>a[f[i]]) la=la-a[f[i]];else la=0;

            la+=b[f[i]];

            sum+=a[f[i]];

      }

      cout<<sum+la;

      return0;

}

                   3.杨佳涵家的树

  题目大意:有N个棵数,需要总长度为M的木材。你只能选定一个高度横的砍一刀,问选多高能满足M这个长度(允许超出一点)。

  数据范围:(1 ≤ M ≤ 2 000 000 000),(1 ≤ N ≤ 1 000 000)

  【输入输出样例1】

eko.in

eko.out

5 20
4 42 40 26 46

36

 (输入保证所有树总长的和大于M,因此一定有解)

 解题思路:这道题的数据这么大,很明显是在考我们二分(但M还不够大,可以水过去,但这种行为是要rp--的),那么难点就在允许超出一点这个条件上。我们可以这样想:保证有解,那么当二分完后如果没找到解,那么right这个指针是否是大于M,且离M最近的呢?答案是肯定的。那么就好办了,下面给出代码

#include<bits/stdc++.h>

usingnamespace std;

int a[1000100]={};
intmain()
{
   int n,m,maxx=0,l,r,mid;
   cin>>n>>m;
   for(int i=1;i<=n;i++)
    {
         cin>>a[i];
         if(a[i]>maxx) maxx=a[i];
    }
   l=1;r=maxx;
   while(true)
   {
         int s=0;
         mid=(l+r)/2;
         for(int i=1;i<=n;i++)
          {
               if(a[i]>mid)
                s=s+a[i]-mid;
               if(s>m)
                {
                     l=mid+1;
                     break;
                }
          }
          if(s<m)
           {
                r=mid-1;
                continue;
           }
          if(s==m)
           {
                cout<<mid;
                return0;
           }
          if(l>=r)
           {
                cout<<r;
                return0;
           }
   }
   return0;
}

 

     

猜你喜欢

转载自blog.csdn.net/qq_40716114/article/details/78969139