CodeForces - 808C-贪心-思维

本文解析了CodeForces上的一道题目,该题要求合理分配一大瓶酒至多个不同容量的酒杯中,需满足特定条件。文章分享了解题思路及代码实现,包括排序、贪心算法的应用。

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

http://codeforces.com/problemset/problem/808/C
给定你n个酒杯的大小,
和你一大瓶酒 容量m,
要求1 每个杯至少放一半,奇数向上取整
2 容量大的杯子放的酒要比容量小的多
3 每个杯子里都要有,并且是整数性质。

是周赛的题,开始时交了十几遍,一直错在第8个样例。比赛完又自己开codeforce交了十几次。。终于发现了错误的原因竟然是两行的代码的顺序颠倒了,导致了一个失误。。。。
那就是在后来 把茶杯里剩下的给其他酒杯倒得时候,要先减去酒杯的容量,在更改cup的大小。。
总体是一个贪心,开始只是想的是每次 放一半,放完一半后,把剩下的一股脑的都放到最大的那个杯子里,没有考虑如果第一个又放满了怎么办。
后来看题解,发现了要从大到小一次再放。
(为什么让所有人都感到满意,这里是贪心的思想。)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
const int maxn=3000;
struct Node
{   int u,v;
    int num;
};
int cmp1(Node a,Node b)
{  return a.u<b.u;//dadaopxiao
}
int cmp2(Node a,Node b)
{  return a.num<b.num;//dadaopxiao
}
int main()
{   int m;
   int w;
   Node v[maxn];
    scanf("%d%d",&m,&w);
      int sum=0;
      for(int i=0;i<m;i++)
      {  scanf("%d",&v[i].u);
         v[i].v=v[i].u/2+v[i].u%2;
         v[i].num=i;
          sum+=v[i].v;
      }
      if(sum>w){printf("-1\n");return 0;}
      sort(v,v+m,cmp1);
      w-=sum;
      int t=m-1;
      while(w>0)
      {   if(v[t].u-v[t].v<w)
            {   w-=(v[t].u-v[t].v);
                v[t].v=v[t].u;

            //w-=(v[t].u-v[t].v);
            t--;
                }
            else
                {v[t].v+=w;w=0;}
      }
        sort(v,v+m,cmp2);
      for(int x=0;x<=m-1;x++)
       cout<<v[x].v<<" ";
        //printf("%d\n",v[m-1].v);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值