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;
}
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;
}