hdu 6667 Roundgod and Milk Tea

左手的ㄟ右手 2023-10-11 09:37 15阅读 0赞

题目

题意:

t组输入,之后一个n代表有n个班级。之后的n行,第一个数代表每班有多少人,第二个代表这个班级能够产生多少杯奶茶,每人只能喝一杯奶茶且不能喝自己班级制作的,问最多能有多少人能喝到奶茶

题解(贪心):

先找出来奶茶总数和学生总数,他们中的最小值就是(最多能喝到奶茶的人数)

当总人数小于奶茶总数时:

那么就只需要一个班级一个班级的判断:除了自己班级制作的奶茶外,其他班级制作的奶茶能不能够本班级人喝,如果不够就让我们之前找出来的(最多能喝到奶茶的人数)减去多少人喝不到奶茶的人数

当总奶茶数少于人总数时:

还是一个一个班级的判断:自己班级制作的奶茶多不多于除了自己班级外其他班级的总人数,如果多于总人数,那么就证明一些奶茶只能剩余下来,又因为奶茶数本来就少与总人数,所以在原来(最多能喝到奶茶的人数)的基础上,要减去剩余下来的奶茶数

代码:

ContractedBlock.gif ExpandedBlockStart.gif

  1. 1 #include <stdio.h>
  2. 2 #include <algorithm>
  3. 3 #include <iostream>
  4. 4 #include <string.h>
  5. 5 using namespace std;
  6. 6 const int maxn = 1e6+5;
  7. 7 typedef long long ll;
  8. 8 struct shudui
  9. 9 {
  10. 10 ll a,b;
  11. 11 } m[maxn];
  12. 12 int main()
  13. 13 {
  14. 14 ll t;
  15. 15 scanf("%lld",&t);
  16. 16 while(t--)
  17. 17 {
  18. 18 ll n,sum1=0,sum2=0;
  19. 19 scanf("%lld",&n);
  20. 20 for(ll i=1; i<=n; ++i)
  21. 21 {
  22. 22 scanf("%lld%lld",&m[i].a,&m[i].b);
  23. 23 sum1+=m[i].a;
  24. 24 sum2+=m[i].b;
  25. 25 }
  26. 26 ll ans=0;
  27. 27 if(sum1<=sum2)
  28. 28 {
  29. 29 for(ll i=1; i<=n; ++i)
  30. 30 {
  31. 31 if(m[i].a>sum2-m[i].b)
  32. 32 ans=ans+m[i].a-sum2+m[i].b;
  33. 33 }
  34. 34 printf("%lld\n",sum1-ans);
  35. 35 }
  36. 36 else
  37. 37 {
  38. 38 for(ll i=1; i<=n; ++i)
  39. 39 {
  40. 40 if(m[i].b>sum1-m[i].a)
  41. 41 ans=ans+m[i].b-sum1+m[i].a;
  42. 42 }
  43. 43 printf("%lld\n",sum2-ans);
  44. 44 }
  45. 45 }
  46. 46 return 0;
  47. 47 }

转载于:https://www.cnblogs.com/kongbursi-2292702937/p/11353621.html

发表评论

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

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

相关阅读

    相关 hdu 3590——PP and QQ

    题意: 有多颗树,然后树上删边游戏,最后一个删的人输。 思路: 其实就是树上删边游戏和anti-sg结合嘛。 对于树上删边: 1. 叶子节点的sg为0 2.

    相关 HDU 6438 Buy and Resell

    题目:[点击打开链接][Link 1] 题意:给出 n ,表示 n 天。给出 n 个数,a\[i\] 表示第 i 天,物品的价格是多少。每天可以选择买一个物品,或者卖一

    相关 [hdu6580]Milk

    考虑定义以下dp数组: 1.g1\[i\]\[j\]表示第i行从中间出发向左取j瓶牛奶最少要多久 2.g2\[i\]\[j\]表示第i行从中间出发向右取j瓶牛奶最少要多