Problem 1: Railway Catering Contracts, (K Narayan Kumar, CMI)
Siruseri政府刚刚委托世界上最长,最现代化的铁路线之一。这条路线贯穿Siruseri的整个长度,穿过Siruseri的许多大城市和许多小城镇和村庄。
沿着这条路线的火车站都是在建造时考虑到旅客的舒适度。每个车站都有大型停车场,舒适的候车室和充足的餐馆空间。铁路部门想要将这些餐馆的餐饮服务外包出去。
不幸的是,餐饮承包商并非慈善家,他们希望最大化利润。 Siruseri经济调查对不同的车站进行了可行性研究,并记录了该路线上所有火车站的餐馆的预期利润(或损失)。每个承包商都希望只在有利可图的工作站运营餐饮服务,并远离亏损的工作场所。
另一方面,当局希望确保每个电台都能满足。为此目的,当局提出以小组形式外包电台。他们将确定最小尺寸K,并且只允许承包商竞标任何连续的K或更多站点。
例如,假设沿线有8个站点,其盈利能力如下:
Station 1 2 3 4 5 6 7 8 Expected Profits -20 90 -30 -20 80 -70 -60 125
如果K被固定为3,承包商可以选择3,4,5和6号站点。这将使他获得-40的总利润(即损失40)。他本可以选择3,4和5给他30的利润。另一方面,如果他选择2,3,4和5站,他将获利120.你可以检查这是最好的选择当K = 3时。
如果K = 1,那么最好的选择是仅竞标第8站并获利125。 您已被承包商聘用。你的任务是帮助他确定要竞标的站点,以便最大化他的预期利润。
输入格式
输入的第一行包含两个整数N和K,其中N是站的数量,K是必须构成部分或出价的最小连续站数。下一个N + 1行(第2行,......,N + 1)描述了N个站的盈利能力。第i + 1行包含一个整数,表示第i站的预期利润。
输出格式
单个整数P,表示可能的最大利润。
测试数据
您可以假设1≤N≤1000000且1≤K≤N。您可以进一步假设50%的输入N≤5000。
示例:
我们使用上面的例子来说明输入和输出格式:
示例输入1:
8 3 -20 90 -30 -20 80 -70 -60 125
示例输出1:
120
示例输入2:
8 1 -20 90 -30 -20 80 -70 -60 125
示例输出2:
125
我所做的是暴力,但所有测试用例都无法通过。
某些测试用例给出了TLE(超出时间限制)。当算法效率低时,时间限制超过。你能帮我找到有效的算法吗?
这是我的代码:
#include <iostream>
using namespace std;
int main()
{
int n, k;
cin >> n >> k;
int vec[n];
for(int i = 0; i<n; i++)
{
cin >> vec[i];
}
long long sum = -922337203685477580;
for(int i = 0; i <= n - k + 1; i++)
{
int kid = 0;
for(int j = i; j <= i + k - 1; j++) kid += vec[j];
int man;
for(man = i + k; man<n; man++)
{
if(kid >= sum)
sum = kid;
kid = kid + vec[man];
}
}
cout << sum;
}