全部TLE,求助!

P1167 刷题

wuyusheng @ 2024-10-28 20:31:19

在本地运行非常快,但在洛谷上它就超时。就是不知道怎么了。有没有大佬能解释一下?

#include<bits/stdc++.h>
using namespace std;
int a[5001],b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
long long sum=0,sum2=0,sum3;
int y,m,d,h,M,y2,m2,d2,h2,M2,n;
int cnt=0,j=1;

int rn(int n)
{
    if(n%4==0&&n%100!=0||n%400==0) return 1;
    else return 0;
} 

int cntd()
{
    sum=y*365*24*60+m*b[m]*24*60+d*24*60+h*60+M;
    sum2=y2*365*24*60+m2*b[m2]*24*60+d2*24*60+h2*60+M2;
    if(rn(y)&&m>=2&&d>=28) sum+=24*60;
    if(rn(y2)&&m2>=2&&d2>=28) sum2+=24*60;
    sum3=sum2-sum;
}

int main()
{
    char c;
    cin>>n;
    for(int i=1; i<=n; i++) scanf("%d",&a[i]);
    cin>>y>>c>>m>>c>>d>>c>>h>>c>>M>>y2>>c>>m2>>c>>d2>>c>>h2>>c>>M2;
    sort(a+1,a+1+n);
    cntd();
    while(sum3>0)
    {
        if(sum3>=a[j])
        {
            cnt++;
            sum3-=a[j];
        }
        j++;
    }
    cout<<cnt<<endl;
}

by Terrible @ 2024-10-28 20:33:47

@wuyusheng

函数声明 int cntd() 改为 void cntd()

本地把 O2 打开,大概率也会出错。

void 函数执行到末尾必须有返回值,否则在洛谷编译环境下编译出的汇编对应位置可能没有ret,导致各种奇怪的错误。


by Terrible @ 2024-10-28 20:38:47

主函数返回值必须是 int,在 C++98 以后 int main() 结束程序时可以不写 return 0;

其他非 void 函数结束时均需要有明确的返回值,否则结果未定义。


by wuyusheng @ 2024-10-29 12:52:55

@Terrible 改成了这个样子

#include<bits/stdc++.h>
using namespace std;
int a[5001],b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
long long sum=0,sum2=0,sum3;
int y,m,d,h,M,y2,m2,d2,h2,M2,n;
int cnt=0,j=1;

int rn(int n)
{
    if(n%4==0&&n%100!=0||n%400==0) return 1;
    else return 0;
} 

long long f(int n)
{
    long long s=0;
    for(int i=1; i<=n; i++) s+=b[i];
    s=s*24*60;
    return s;
}

long long f2(int n,int m)
{
    long long s=0;
    for(int i=n+1; i<m; i++)
    {
        if(rn(i)) s++;
    }
    return s; 
}

void cntd()
{
    sum=y*365*24*60+f(m)+d*24*60+h*60+M;
    sum2=y2*365*24*60+f(m2)+d2*24*60+h2*60+M2;
    if(rn(y)&&m>=2&&d>=28) sum+=24*60;
    sum2+=f2(y,y2)*24*60;
    sum3=sum2-sum;
}

int main()
{
    char c;
    cin>>n;
    for(int i=1; i<=n; i++) scanf("%d",&a[i]);
    cin>>y>>c>>m>>c>>d>>c>>h>>c>>M>>y2>>c>>m2>>c>>d2>>c>>h2>>c>>M2;
    sort(a+1,a+1+n);
    cntd();
    while(sum3>0&&j<=n)
    {
        if(sum3>=a[j])
        {
            cnt++;
            sum3-=a[j];
        }
        else
        {
            cout<<cnt<<endl;
            return 0;
        }
        j++;
    }
    cout<<cnt<<endl;
}

为什么#5#6WA?


by Terrible @ 2024-10-29 15:22:37

@wuyusheng 下载数据自己改吧,我只管 RE 的问题。


|