如何在STAMPS挑战中修复超出SPOJ时间限制的错误?

时间:2015-03-13 05:34:47

标签: c++ performance

以下是问题的链接:http://www.spoj.com/problems/STAMPS/; 这是当前代码的ideone链接:http://ideone.com/AcHfc6; 这是代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int main() 
{
    int t,x,n,sum,sum2,count,i,j;
    scanf("%d",&t);
    for(j=1;j<=t;j++)
    {
        cin>>x>>n;
        sum=0;
        int offer[n];
        for(i=0;i<n;i++)
        {
            cin>>offer[i];
            sum+=offer[i];
            sort(offer,offer+n);
        }

        if(sum>=x)
        {
            sum2=0;
            count=0;
            for(i=n-1;i>=0;i--)
            {
                sum2+=offer[i];
                if(sum2<=x)
                    count++;
                else
                    break;
            }
            cout<<"Scenario #"<<j<<":"<<endl;
            cout<<count<<endl;
            cout<<endl;
        }
        else
        {
            cout<<"Scenario #"<<j<<":"<<endl;
            cout<<"impossible"<<endl;
            cout<<endl;
        }
    }
    return 0;
}

代码为给定的测试用例提供了正确的答案,但它会导致TLE。我已尝试将cincout转换为scanf / printf,但奇怪的是,答案不一样,我不知道答案如何彼此不同。

出了什么问题?

1 个答案:

答案 0 :(得分:1)

我怀疑你的主要问题在于:

for(i=0;i<n;i++)
{
    cin>>offer[i];
    sum+=offer[i];
    sort(offer,offer+n);
}

您为输入的每个数字排序数据。此外,您对随机数据进行排序,因为数组中只有i行有效数据,而不是n行。排序应该在循环之外完成一次:

for(i=0;i<n;i++)
{
    cin>>offer[i];
    sum+=offer[i];
}
sort(offer,offer+n);