luoguP1167刷题

在810开出我的首发题解

luogu上也交了这篇题解(来自重构过代码的老萌新)

 —————————————————————————————————

 需要注意的几点:

 1.闰平年问题 (可以设计一个函数)

 2.总时间以分钟为单位

因为数据范围是从0000年到9999年的,这就意味着数值已经膨胀到int已经装不下啦!!!(老萌新我血与泪的教训)

 unsigned long long 是完全可以的

 3.存储比赛时间

 完全可以加一个字符(char)用来存放中间的符号(:和-),其余的用int就可以存下了(详见代码)

4.输入的题目时间排序

 单纯的贪心思想,时间越少先做,做一个加一

 蒟蒻统计时间的思路

 有样例好说话:(例2018-03-21-03:00 2020-09-08-12:00)

步骤

1.先把结尾年忽略,统计前面的部分(如样例就只先统计2018年2019年两个完整的年份),这样就是几个365,366相加的问题。

 2.接下来就是加上后面的(2020年的)时间,这应该好算多了吧,单纯加上八个月和九月的8天12小时(全部化为分钟,就是×24,×60的问题)

 3.最后就是减去开始(2018年)比赛所没有经历的前两个月零多少天等等的分钟数(与第2步思路近似,差别就是求出的这块时间是需要减掉的 _(ÒωÓ๑ゝ∠)__)

 (ps:以上用unsigned long long 存储收据完全可以)

 一个sort()解决其它一切问题。。。

郑重的贴上饱含n次提交的AC代码
 
 

#include<bits/stdc++.h>
using namespace std;
unsigned long long  a[5001];
int b[13]={0,0,31,59,90,120,151,181,212,243,273,304,334};
int ass(int p)
{
    if(p%400==0){return 5;}
    else if(p%100!=0&&p%4==0){return 5;}
    else {return 7;}
}
int main()
{
    int n;cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    int y,m,d,h,min;char s;
    int y1,m1,d1,h1,min1;
    cin>>y>>s>>m>>s>>d>>s>>h>>s>>min;
    cin>>y1>>s>>m1>>s>>d1>>s>>h1>>s>>min1;
    unsigned long long x=0,x1=y1-y;
    for(int i=0;i<x1;i++)
    {
        x+=365;
        if(ass(y+i)==5){x++;}
    }
    x=x*24*60;
    //cout<<x<<endl;
    unsigned long long x3=(b[m1]+d1-1)*24*60+h1*60+min1;
    if(m1>2&&ass(m1)==5){x3+=1;}
    x+=x3;
    //cout<<x<<endl;
    
    x3=(b[m]+d-1)*24*60+h*60+min;
    if(m>2&&ass(m)==5){x3+=1;}
    x-=x3;
    //cout<<x<<endl;
    
    int u=0;
    for(int i=0;i<n;i++)
    {
        //cout<<"x="<<x<<endl;
        //cout<<"a[i]="<<a[i]<<endl;
        if(a[i]<=x){u++;x-=a[i];}
        else{break;}
    }
    cout<<u<<endl;
    return 0;
}


——————————————————8.10祝我生日快乐❤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值