简单贪心-CodeForces 808C-Tea Party

心已赠人 2022-05-16 06:38 267阅读 0赞
  • 简单贪心-CodeForces 808C-Tea Party


题目链接:C. Tea Party

思路:

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

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

2.所有的茶必须倒完

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

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

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

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

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. struct Cup{
  5. int index; //原先下标
  6. int V; //杯子容量
  7. int tea_v; //杯子装茶的容量
  8. };
  9. bool Mycmp1(Cup a,Cup b)
  10. {
  11. return a.V>b.V;;
  12. }
  13. bool Mycmp2(Cup a,Cup b)
  14. {
  15. return a.index<b.index;
  16. }
  17. int main()
  18. {
  19. int n,w,Cur;
  20. Cup Cup_list[105];
  21. cin>>n>>w;
  22. for(int i=0;i<n;i++)
  23. {
  24. cin>>Cup_list[i].V;
  25. Cup_list[i].index=i;
  26. if(Cup_list[i].V%2)
  27. Cup_list[i].tea_v=Cup_list[i].V/2+1;
  28. else
  29. Cup_list[i].tea_v=Cup_list[i].V/2;
  30. w-=Cup_list[i].tea_v;
  31. // cout<<w<<endl;
  32. }
  33. if(w<0) //不够每杯倒一半,不符合
  34. {
  35. cout<<"-1"<<endl;
  36. return 0;
  37. }
  38. sort(Cup_list,Cup_list+n,Mycmp1); //对杯子容量降序拍
  39. for(int i=0;i<n;i++)
  40. {
  41. if(w==0) //不够倒直接跳出
  42. break;
  43. Cup_list[i].tea_v+=w; //差取,假设全部茶倒一个杯子,多出杯子容量部分是剩下的茶
  44. if(Cup_list[i].tea_v>Cup_list[i].V)
  45. {
  46. w=Cup_list[i].tea_v-Cup_list[i].V; //取多余
  47. Cup_list[i].tea_v=Cup_list[i].V; //倒满
  48. //cout<<w<<endl;
  49. }
  50. else
  51. w=0;
  52. }
  53. if(w) //全部倒满还有剩余
  54. {
  55. cout<<"-1"<<endl;
  56. return 0;
  57. }
  58. sort(Cup_list,Cup_list+n,Mycmp2); //回复原先顺序
  59. for(int i=0;i<n;i++)
  60. {
  61. if(i)
  62. cout<<" "<<Cup_list[i].tea_v;
  63. else
  64. cout<<Cup_list[i].tea_v;
  65. }
  66. cout<<endl;
  67. return 0;
  68. }

发表评论

表情:
评论列表 (有 0 条评论,267人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Codeforces 353E 贪心

    题意:给你一张有向图,第i条边连接i号点和(i + 1) % n号点,问最多可以选择多少个点,使得这些点互相不可达。 思路:容易发现,如果某个边的集合点的数目大于等于2,那么

    相关 C. Strange Birthday Party贪心

    [题目][Link 1] 题意:我有n个朋友,商店有m种商品,这m种商品按序号价格从小到大排列,对于每一个朋友我给出一个序号k,我可以直接给朋友序号k的商品价格的金钱或给