【算法赛】2.黛玉泡茶 题型:简单贪心 难度:简单 3次过

90 阅读1分钟

2.黛玉泡茶【算法赛】 - 蓝桥云课 (lanqiao.cn)

思想

第一眼就可以看出这是一个考察贪心的算法,因为求的是最少壶斟满K杯酒,因此我们只需要对所有容量的酒杯进行升序排序,把容量小的酒杯放到前面,这样就可以用最少的壶数斟满K杯了。

code1

只过了60%,思想:

如果壶里面的酒不够倒满一杯酒,那就提前借一壶酒,把杯子倒满,同时,结果累加已经用了一壶酒(借来的那一壶酒)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+10;
int c[N];
int ans=1;

signed main()
{
    int n,m,k;cin>>n>>m>>k;
    
    
    for(int i=0;i<n;i++)
    {
        cin>>c[i];
    }
    sort(c,c+n);
    
    int temp=m;    
    int i=0;

    while(k--)
    {
      if(m<c[i])
      {
        m+=temp;
        ans++;  //提前透支一壶
        m-=c[i];
        i++;
      }
      else{
        m-=c[i];
        i++;
      }
    }


    
    cout<<ans<<endl;
    return 0;
}

image.png

code2

code1中忽略了一点,就是有可能杯子的容量很大,即便我们借了一壶酒仍然不够倒满酒杯。因此我们需要多借几壶酒,借到可以把酒杯倒满为止。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e3+10;
int c[N];
int ans=1;

signed main()
{
    int n,m,k;cin>>n>>m>>k;
    
    
    for(int i=0;i<n;i++)
    {
        cin>>c[i];
    }
    sort(c,c+n);
    
    int temp=m;    
    int i=0;

    while(k--)
    {
      while(m<c[i])
      {
        m+=temp;
        
        ans++;  //提前透支一壶

      }
      m-=c[i]; 
      i++;
    }


    
    cout<<ans<<endl;
    return 0;
}

image.png