CodeForces 557B(贪心)

博客介绍了如何解决CodeForces上的557B问题,采用贪心策略。首先对杯子容量排序,判断是否能让所有女性朋友们的水杯水量相同且是男性朋友们的一半。根据条件分配水量,并与总水量对比取最小值,最后进行输出。文章强调在计算过程中使用double类型避免精度误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原链接: CodeForces 557B.

挺简单一贪心哈。

题目大意:你拥有w毫升的水,2*n个杯子,每个杯子分别能装a[i]毫升的水,你有n个女性朋友和n个男性朋友,你要给所有人倒水,同时满足:

  1. 每个女性朋友水杯里拥有同样多的水;
  2. 每个男性朋友水杯里拥有同样多的水;
  3. 男性朋友水杯里的水要是女性朋友的两倍。

先上AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+10;
double cap[N];
double w;
int main()
{
    int n;
    scanf("%d %lf",&n,&w);
    n*=2;
    for(int i=0;i<n;++i)
        scanf("%lf",&cap[i]);
    sort(cap,cap+n);
    double ans=w;
    if(cap[n/2]>=2 * cap[0])
    {
        double k=n / 2 * 3 * cap[0];
        ans=min(ans,k);
    }
    else
    {
        double k=1.0 * n/2 * cap[n/2] / 2 * 3;
        ans=min(ans,k);
    }
    printf("%f\n",ans);
    return 0;
}

最好一开始就用double,避免因为int和double的精度问题WA。

先排个序,a[0]是女生最多能拥有的水量,a[n]是男生最多能拥有的水量

如果2*a[0]<=a[n],那么所有女生都是a[0],所有男生都是a[0]*2

否则所有女生都是a[n]/2,所有男生都是a[n]

然后再和w比较一下,取小的那一个,最后%f输出一下,OK,A了。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值