1 条题解

  • 0
    @ 2025-8-24 21:22:08

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Rocket_raccoon_
    **

    搬运于2025-08-24 21:22:07,当前版本为作者最后更新于2018-10-24 13:39:28,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    应该属于比较简单的解法了qwq

    先把每月的天数算出来,再把输入的时间预处理一下,便于算出时间间隔。然后排序比较大小,取最大值输出转化后的时间即可。

    这里要注意从一年开始开始到第一天到人间的时间段和到年尾的时间段。

    具体的细节算法在注释中都体现了

    #include<iostream>
    #include<algorithm>
    using namespace std;
    int num[66666],ans;
    double k;
    int f[13]={0,0,31,60,91,121,152,182,213,244,274,305,335};
    //预处理每月的天数,注意C++的默认数组下标是从0开始的
    int main(){
    	int i,a,b,n;
    	
    	cin>>n;
    	
    	for (i=1; i<=n; i++){
    		cin>>a>>b;
    		num[i]+=f[a];
    		num[i]+=b;//处理天数
    	}
    	sort(num+1,num+n+1);//STL模板的sort快排
    	num[n+1]=367; //一年的末尾(想一想为什么要用367)
    	for (i=1; i<=n+1; i++){
        //注意这里是从1开始循环,因为num数组是在main函数外定义的,所以num[0]值为0,因此可以处理第一段时间
    		ans=max(num[i]-num[i-1]-1,ans);//ans取最大值
    	}
    	k=(ans*1.0*24*3600/366)+0.5;//处理时间,注意四舍五入,加上0.5在换成整数是很常见的方法
    	ans=k;//强制转化为整数
    	
    	cout<<ans;//输出,完事
    	
    	return 0;
    } 
    
    • 1

    信息

    ID
    179
    时间
    1000ms
    内存
    125MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者