简单贪心-CodeForces 808C-Tea Party

本文介绍了一道名为“TeaParty”的算法题的解题思路及实现代码。该题要求在给定的条件下分配茶水,使得所有客人都满意,并通过排序和贪心策略解决此问题。

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

  • 简单贪心-CodeForces 808C-Tea Party


题目链接:C. Tea Party

思路:

题目大意是有n个杯子,每个杯子容量为ai,一壶茶容量s,问给定情况是否让所有客人满意

1.每个杯子至少有一半容量的茶,且为整数

2.所有的茶必须倒完

3.满足两个杯子i,j,如果ai>aj,那么i杯中的茶不能少于j杯中的茶

先往每个杯子倒至少一半容量的茶,如果总茶水容量不足以满足每杯至少一半,不符合情况

然后把剩余的茶,依次倒满到容量从大到小的杯子中,这样一定可以满足容量大的杯子倒的茶多,如果杯子全满但茶没倒完,也是不符合要求的

排序,用结构体做,依次倒满需要打乱原先顺序,结构体中记录下标

代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct Cup{
    int index;  //原先下标
    int V;   //杯子容量
    int tea_v;   //杯子装茶的容量
};
bool Mycmp1(Cup a,Cup b)
{
    return a.V>b.V;;
}
bool Mycmp2(Cup a,Cup b)
{
    return a.index<b.index;
}
int main()
{
    int n,w,Cur;
    Cup Cup_list[105];
    cin>>n>>w;
    for(int i=0;i<n;i++)
    {
        cin>>Cup_list[i].V;
        Cup_list[i].index=i;
        if(Cup_list[i].V%2)
            Cup_list[i].tea_v=Cup_list[i].V/2+1;
        else
            Cup_list[i].tea_v=Cup_list[i].V/2;
        w-=Cup_list[i].tea_v;
       // cout<<w<<endl;
    }
    if(w<0)   //不够每杯倒一半,不符合
    {
        cout<<"-1"<<endl;
        return 0;
    }
    sort(Cup_list,Cup_list+n,Mycmp1);   //对杯子容量降序拍
    for(int i=0;i<n;i++)
    {
        if(w==0)  //不够倒直接跳出
            break;
        Cup_list[i].tea_v+=w;     //差取,假设全部茶倒一个杯子,多出杯子容量部分是剩下的茶
        if(Cup_list[i].tea_v>Cup_list[i].V)
        {
            w=Cup_list[i].tea_v-Cup_list[i].V;   //取多余
            Cup_list[i].tea_v=Cup_list[i].V;   //倒满
            //cout<<w<<endl;
        }
        else
            w=0;
    }
    if(w)   //全部倒满还有剩余
    {
        cout<<"-1"<<endl;
        return 0;
    }
  
    sort(Cup_list,Cup_list+n,Mycmp2);  //回复原先顺序
    for(int i=0;i<n;i++)
    {
        if(i)
            cout<<" "<<Cup_list[i].tea_v;
        else
            cout<<Cup_list[i].tea_v;
    }
    cout<<endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值