我正在做一个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时,只有连续和休息,否则它会一直持续到最后。
亚太区首席技术官Matt
答案 0 :(得分:3)
如您在解释after it goes to 5 it compares 12 to 1 , 1+3 , 1+3+4 .. and in this way
中所述,无需再次重启。仔细看看你的方法,你一次又一次地重新计算一个子阵列的总和。例如 - 当您执行1+3+4
时,您已经计算了子阵列2+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;
}