5 条题解

  • 25
    @ 2024-2-20 21:05:49

    放牛

    这道题就是每一次输入都将x-k到x+k的范围 加上g最后前缀和一下再求最大值即可啦~~ 上代码!

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+5;
    int d[N],g,x,n,k,maxx=-1,m;
    long long ans;
    int main()
    {
        cin>>n>>k;
        for (int i=1;i<=n;i++)
        {
            cin>>g>>x;
            ans+=g;
            d[max(0,x-k)]+=g;
            d[min(1000001,x+k+1)]-=g;
        }
        for (int i=1;i<=1000000;i++)
        {
            d[i]+=d[i-1];
            if(d[i]>maxx)
            {
                maxx=d[i];
            }
        }
        cout<<maxx;
        return 0;
    }
    

    求求啦~~ 点个赞吧😄

  • 17
    @ 2023-6-30 10:12:30
    题目大意
             存在一个一维数轴,数轴上有若干点,第i个点的位置坐标为xi,数据为gi,求一个坐标p,令区间[p - k, p + k]范围内,点的数据之和最大,求数据之和最大是多少。

    完整思路
            对于数轴上的每一个点i(位置坐标为xi,数据为gi),它可以被吃到的范围是[xi - k, xi + k],不妨令这个范围内的数轴都加gi,代表坐标p在这个范围内,能够被点i影响。维护所有点后,遍历数轴,找到数轴上的最大值,该位置就是坐标p的最优位置。



    题解
    
    // 将第i个点影响范围内的数轴,都加上gi
    for (int i = 1; i <= n; i++)
    {
        cin >> g[i] >> x[i];
        b[max(0, x[i] - k)] += g[i]; // 因为xi - k可能存在负数,需要额外处理
        b[min(1000001, x[i] + k + 1)] -= g[i]; // 因为xi + k可能大于数轴范围,需要额外处理
    }
    
    
    // 遍历数轴,寻找最大值。
    for(int i = 1; i <= 1000000; i++)
    {
        b[i] += b[i - 1];
        maxx = max(maxx, b[i]);
    }
    
    
    • 3
      @ 2024-6-16 16:05:58
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e6+5;
      int d[N],g,x,n,k,maxx=-1,m;
      long long ans;
      int main()
      {
          cin>>n>>k;
          for (int i=1;i<=n;i++)
          {
              cin>>g>>x;
              ans+=g;
              d[max(0,x-k)]+=g;
              d[min(1000001,x+k+1)]-=g;
          }
          for (int i=1;i<=1000000;i++)
          {
              d[i]+=d[i-1];
              if(d[i]>maxx)
              {
                  maxx=d[i];
              }
          }
          cout<<maxx;
          return 0;
      }
      
    • 2
      @ 2023-7-2 18:48:08

      间问题的示例,它接受两个整数n和k作为输入,表示区间的数量和一个常数k。然后,代码通过循环读取每个区间的权值和左右端点,并存储在pair类型的数组q中。

      接下来,代码对数组q按照右端点进行排序,以便之后的处理。然后,代码使用两个指针i和j来遍历所有区间。在每次迭代中,代码累加当前区间的权值,并判断当前区间是否能被前面的区间完全覆盖。如果不能,就舍弃最左边的区间,并更新累加的权值sum。

      最后,代码输出最大的权值和res。

      需要注意的是,这段代码使用了C++ STL中的pair类型、sort函数等。同时,为了方便使用,代码定义了宏#define x first和y second

      #include <bits/stdc++.h>
      using namespace std;
      
      int n, k;
      
      // 定义一个pair类型,其中first表示区间左端点,second表示区间权值
      typedef pair<int, int> PII;
      const int N = 1e5 + 10;
      PII q[N];
      #define x first // 宏定义,方便使用
      #define y second
      
      int main()
      {
          scanf("%d%d", &n, &k);
          for(int i = 0; i < n; i++)
          {
              scanf("%d%d", &q[i].y, &q[i].x); // 输入区间信息,注意顺序
          }
          
          sort(q, q + n); // 按照右端点排序
          
          int res = 0, sum = 0;
          for(int i = 0, j = 0; i < n; i++) // 从左到右遍历所有区间
          {
              sum += q[i].y; // 累加权值
              while(q[i].x - q[j].x > 2 * k) // 如果当前区间无法被前面的区间完全覆盖
              {
                  sum -= q[j++].y; // 就舍弃最左边的区间
              }
              res = max(res, sum); // 更新最大权值和
          }
          
          cout << res << endl;
          return 0;
      }
      
      • @ 2024-2-13 20:40:38

        跟差分有什么关系?没有用到差分的知识啊

    • -1
      @ 2024-6-15 21:01:34

      必须先初始化为0,(全局),否则会出现Wrong Answer0读取到 2140843464,应为 1059002 这种乱七八糟的数据

      • 1

      信息

      ID
      226
      时间
      1000ms
      内存
      256MiB
      难度
      5
      标签
      (无)
      递交数
      1452
      已通过
      550
      上传者