在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祝我生日快乐❤