题目
信息学院的同学小明毕业之后打算创业开餐馆.现在共有 个地点可供选择。
小明打算从中选择合适的位置开设一些餐馆。
这 个地点排列在同一条直线上。
我们用一个整数序列 来表示他们的相对位置。
由于地段关系,开餐馆的利润会有所不同。我们用 表示在 处开餐馆的利润。
为了避免自己的餐馆的内部竞争,餐馆之间的距离必须大于 。
请你帮助小明选择一个总利润最大的方案。
输入格式
输入第一行是整数 ,表明有 组测试数据。紧接着有T组连续的测试。每组测试数据有 3 行。
第1行:地点总数 , 距离限制 ;
第2行: 个整数,表示 个地点的位置 (按升序排列);
第3行: 个整数,表示 个地点的餐馆利润 。
输出格式
输出共 行,每行输出一组测试数据可能的最大利润。
数据范围
,
,
,
,
输入样例:
2
3 11
1 2 15
10 2 30
3 16
1 2 15
10 2 30
输出样例:
40
30
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| #include <iostream> #define N 110
using namespace std;
int f[N], m[N], p[N]; int n, k;
int main() { ios::sync_with_stdio(false); int T; cin >> T;
while (T --) { cin >> n >> k;
for (int i = 1; i <= n; ++ i) cin >> m[i]; for (int i = 1; i <= n; ++ i) cin >> p[i];
for (int i = 1, maxf = 0, j = 1; i <= n; ++ i) { while (m[i] - m[j] > k) { maxf = max(maxf, f[j]); ++ j; }
f[i] = maxf + p[i]; }
int res = 0; for (int i = 1; i <= n; ++ i) res = max(res, f[i]);
cout << res << endl;
}
return 0; }
|