zoukankan      html  css  js  c++  java
  • 洛谷 P3817 小A的糖果

                         洛谷 P3817 小A的糖果

    题目描述

    小A有N个糖果盒,第i个盒中有a[i]颗糖果。

    小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖。

    输入输出格式

    输入格式:

    第一行输入N和x。

    第二行N个整数,为a[i]。

    输出格式:

    至少要吃掉的糖果数量。

    输入输出样例

    输入样例#1: 复制
    3 3
    2 2 2
    输出样例#1: 复制
    1
    
    
    输入样例#2: 复制
    6 1
    1 6 1 2 0 4
    输出样例#2: 复制
    11
    输入样例#3: 复制
    5 9
    3 1 4 1 5
    输出样例#3: 复制
    0
    

    说明

    样例解释1

    吃掉第二盒中的糖果。

    样例解释2

    第二盒吃掉6颗,第四盒吃掉2颗,第六盒吃掉3颗。

    30%的测试数据,2<=N<=20,0<=a[i], x<=100

    70%的测试数据,2<=N<=1000,0<=a[i], x<=10^5

    100%的测试数据,2<=N<=10^5,0<=a[i], x<=10^9

    这个题好像是个模拟来着,年代比较久远了  qwq

    难度:普及-

    #include<algorithm>
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n, m;
    int sum;
    int a[100005];
    int main() {
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        for(int i = 1; i < n; i++) {
            if(a[i]+a[i+1] > m) {
                int y = a[i]+a[i+1]-m;
                sum += y;
                a[i+1] -= y;
            }
        }
        printf("%d", sum);
        return 0;
    }
    80 分代码,不知道为啥WA了两个点,请大佬指出
    #include<cstdio>
    using namespace std;
    int n, x, k;
    long long ans;
    int a[100001];
    int main()
    {
        scanf("%d%d", &n, &x);
        for(int i = 1; i <= n; i++)
            scanf("%d", &a[i]);
        for(int i = 2; i <= n; i++)
            if(a[i]+a[i-1] > x) {
                k = a[i]+a[i-1]-x;
                if(a[i] >= k)
                    a[i] -= k;
                else a[i] = 0;
                ans += k;
            }
        printf("%lld", ans);
        return 0;
    }
    AC了的代码
    #include <iostream>
    #include <vector>
    int main() {
      unsigned long long N, x;
      std::cin >> N >> x;
      std::vector<unsigned long long> a(N);
      for (unsigned i = 0; i < N; ++i) { std::cin >> a[i]; }
      unsigned long long ans = 0ull;
      for (unsigned i = 1; i < N; ++i) {
        if (a[i - 1] + a[i] > x) {
          if (a[i - 1] < x) {
            ans += a[i] + a[i - 1] - x;
            a[i] -= a[i] + a[i - 1] - x;
          } else {
            ans += a[i];
            a[i] = 0;
            ans += a[i - 1] - x;
          }
        }
      }
      std::cout << ans;
      return 0;
    }
    题目自带的标程
  • 相关阅读:
    设计模式-11-代理模式
    设计模式-10-装饰者
    设计模式-9-组合
    设计模式-8-适配器
    设计模式-7-原型模式
    设计模式-6-建造者
    设计模式-5-单例模式
    u-boot-1.1.6 设置新分区支持设备树
    u-boot-2014.10移植(8)重定位,支持NAND启动
    u-boot-2014.10移植(7)修改环境变量的存储位置
  • 原文地址:https://www.cnblogs.com/v-vip/p/8588219.html
Copyright © 2011-2022 走看看