你能帮我找到最好的算法吗?

时间:2013-12-22 16:28:47

标签: c++ algorithm

  

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;
}

0 个答案:

没有答案