当前位置:   article > 正文

P3817 小A的糖果 (贪心)

P3817 小A的糖果 (贪心)

传送门

思路:

首先我们可以把这几个糖果盒分对来讨论; 先从第一个糖果盒和第二个开始; 如果一个糖果盒的数量就超限了,我们当然至少要把它吃到剩下x个; 然后如果单论两个都没有超限,但加起来超限了怎么办呢? 首先第一个糖果盒是只有一个分组的(和第二个), 而第二个糖果盒却有两个分组(和第1个/和第3个); 所以如果我们吃掉第一个里的,只会减少一个分组的量,而如果吃掉第二个里的,可以减少2个分组的量。所以我们要尽量吃掉第二个里的糖果。 处理好第一个分组后,来看第二个,因为第一个分组已经被处理好了,所以可以无视它,然后问题又变成了前一个问题。 以此类推就好了。

参考代码:

  1. using ll = long long;
  2. int main() {
  3. std::ios::sync_with_stdio(false);
  4. std::cin.tie(nullptr);
  5. int n, x;
  6. std::cin >> n >> x;
  7. ll sum{};
  8. std::vector<ll> a(n);
  9. for (int i = 0; i < n; i++) {
  10. std::cin >> a[i];
  11. }
  12. if (a[0] > x) {
  13. sum += a[0] - x;
  14. a[0] = x;
  15. }
  16. for (int i = 1; i < n; i++) {
  17. if (a[i] + a[i - 1] > x) {
  18. sum += a[i] + a[i - 1] - x;
  19. if (a[i] >= (x - a[i] - a[i - 1])) {
  20. a[i] -= a[i] + a[i - 1] - x;
  21. } else {
  22. a[i - 1] -= (a[i] + a[i - 1] - x) - a[i];
  23. a[i] = 0;
  24. }
  25. }
  26. }
  27. std::cout << sum;
  28. return 0;
  29. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/347373
推荐阅读
  

闽ICP备14008679号