在斯波杰酒店获得TLE
getting TLE in Spoj-Hotels
我收到来自spoj的酒店超过时间限制。
这是我的代码:
int main()
{
long long n,m;
scanf("%lld",&n);
scanf("%lld",&m);
long long a[300005],dp[300005];
for(int i=0;i<n;i++) scanf("%lld",&a[i])
for(int i=1;i<n;i++) a[i]+=a[i-1];
for(int i=n-1;i>=0;i--)
{
if(a[i]<m){
dp[0] = a[i];
break;
}
}
for(int i=1;i<n;i++)
{
long long x = a[i-1];
for(int j=i;j<n;j++)
{
a[j]-=x;
}
for(int j=n-1;j>=i;j--)
{
if(a[j]<=m){
dp[i] = a[j];
break;
}
}
}
long long max_=0;
for(int i=0;i<n;i++)
{
max_ = max(max_,dp[i]);
}
printf("%lldn",max_);
return 0;
}
解释:
首先,我通过与以前的值相加来计算数组"a"中的所有值。然后,计算出dp数组中小于等于"m"的最大值。然后,我开始从前面的减去数组中每个元素的当前值,并将值存储在dp数组中。所以,dp数组的最大值会给我答案。
例如:n=5,m=12;
2 1 3 4 5
我的数组"a":2 3 6 10 15
然后在第二遍之后:2 1 4 8 13
然后在第三遍之后:2 1 3 7 12
以下是有效的代码:Ideone
这个问题的复杂性为O(n)。
#include <iostream>
using namespace std;
int a[300013];
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++) scanf("%d",&a[i]);
long long sumNow = 0;
long long maxAns = 0;
int left=0,right=-1;
while(right!= n-1){
right++;
sumNow+=a[right];
while(sumNow>m){
sumNow-=a[left];
left++;
}
maxAns = max(maxAns,sumNow);
}
printf("%lld", maxAns);
return 0;
}
相关文章:
- 简化代码以避免在顺时针旋转2D矩阵时出现TLE
- 为什么在某些情况下,我在这个问题上会得到TLE?
- 如何在这样的代码中避免 TLE?
- DFS + 记忆解决方案在 LeetCode 上获取 TLE
- DFS在kefa和park中给予TLE(代码560C)
- 记忆的解决方案给出了TLE,而列表的解决方案则没有
- TLE试图使用Dinic算法在SPOJ上求解Fastflow
- BFS 方法中的 TLE for SPOJ AKBAR
- 来自多个来源的关于BFS的TLE
- 在斯波杰酒店获得TLE
- TLE in codeforce's Dijkstra
- 我的代码在在线评判上获得了 TLE(超出时间限制),即使我已经根据社论进行了编码
- 斯波伊最后挖掘,得到TLE
- 如何改进此算法以防止TLE是SPOJ提交
- 面向对象的酒店预订系统设计
- TLE用于大输入.如何在时间限制内运行我的代码
- 如何摆脱TLE
- SPOJ SUMFOUR……测试用例9的TLE