5 条题解
-
25
放牛
这道题就是每一次输入都将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
题目大意
存在一个一维数轴,数轴上有若干点,第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
#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
间问题的示例,它接受两个整数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; }
- 1
信息
- ID
- 226
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 1452
- 已通过
- 550
- 上传者