【问题标题】:TLE to HOTELS (spoj) [closed]TLE到酒店(spoj)[关闭]
【发布时间】:2012-06-03 02:21:52
【问题描述】:

我正在做一个 spoj 的问题,我试图这样做,但我总是得到 TLE(时间限制已过期) 问题是Hotels。这是我的代码,请告诉我如何优化它。

#include<stdio.h>

int main()
{
    unsigned long long int a,b,i;
    scanf("%llu %llu",&a,&b);
    unsigned long long int arr[a];
    for(i=0;i<a;i++)
    {
        scanf("%llu",&arr[i]);
    }


        unsigned long long int d;
        unsigned long long int k,z=0;
    for(i=0;i<a;i++)
    {
        d = arr[i];
        for(k=i+1;k<a+1;k++)
        {
            if (d<b)
            {
                if(z<d)
                z = d;
            }
            else
            if(d==b)
            {
                z = d;
                break;
            }
            else
            break;
            d = d + arr[k];
        }
        if(d==b)
        break;
    }
    printf("%llu",z);
    return 0;
}

在这种情况下,如果输入 5 12 ,这五个是 2 1 3 4 5 到 12 那么我这样做: 首先我将 12 与 2 进行比较,然后是 2+1 ,然后是 2+1+3 ,依此类推,在它达到 5 之后,它将 12 与 1 、 1+3 、 1+3+4 进行比较 .. 这样我就采取了只有当我发现等于 12 时才连续并中断,否则它会一直持续到最后。

Hitesh

【问题讨论】:

  • 投票结束。这里没有任何实质的问题。作者没有做出任何努力来解释问题是什么,并且假设我们可以读懂她的想法。我举手……
  • 快速解决这个问题的关键是你选择的酒店必须在输入列表中连续。
  • @jerry 我已经连续选择了,
  • @hitesh_jhamb:我相信你的话。从您的代码中(对我而言)这似乎并不明显——尽管我承认我根本没有很好地遵循您的代码。也许比d、b、z 等更有意义的变量名会有所帮助。快速检查看似最简单、最明显的代码当然没有创下速度记录,但确实在规定的时间内完成。

标签: c algorithm dynamic-programming


【解决方案1】:

不需要像你在解释after it goes to 5 it compares 12 to 1 , 1+3 , 1+3+4 .. and in this way中所说的那样重新启动。仔细查看您的方法,您正在一次又一次地重新计算子数组的总和。例如 - 当你在做 2+1+3+4 时,你已经计算了子数组 1+3+4 的总和。因此仍有一定的优化空间。

在说出确切的解决方案之前,我希望您先尝试一下。另外一个提示参考以下问题Find subarray with given sum。

编辑:分享完整的解决方案以备将来使用。

#include<stdio.h>

/* Returns the maximum possible sum less than or equal to the gieven sum */
int subArraySum(int arr[], int n, int sum)
{
    /* Initialize curr_sum as value of first element
     and starting point as 0 */
    int curr_sum = arr[0], max_sum = 0, start = 0, i;

    /* Add elements one by one to curr_sum and if the curr_sum exceeds the
     sum, then remove starting element */
    for (i = 1; i <= n; i++)
    {
        // If curr_sum exceeds the sum, then remove the starting elements
        while (curr_sum > sum && start < i-1)
        {
            curr_sum = curr_sum - arr[start];
            start++;
        }

        //keep track of the maximum sum so far.
        if (max_sum < curr_sum)
            max_sum = curr_sum;

        curr_sum = curr_sum + arr[i];
    }

    return max_sum;
}

// 测试上述功能的驱动程序

int main()
{
    int arr[] = {7, 3, 5, 6};
    int n = sizeof(arr)/sizeof(arr[0]);
    int sum = 9;
    printf("Max Sum = %d\n", subArraySum(arr, n, sum));
    return 0;
}

【讨论】:

  • 谢谢,我终于通过你提供的链接接受了它
  • 我也尝试提交,成功拿到第14名。你的呢?
  • 好吧,我得到了 141,你还要做什么才能在 0.14 秒内得到它,而我在 0.85 秒内得到它
  • 添加一个 if 构造来检查循环开始时是否 curr_sum==sum。将减少迭代。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多