原题位置: https://www.luogu.org/problem/show?pid=1167
这道题其实很简单,但是我之所以要写这篇题解,是因为有一个点需要掌握;
就是如果两个时间差不好算,可以找一个比较小的时间来作为底;
然后,分别计算两个时间距离底的差,然后做差,得到答案;
cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#define II int
#define LO long long
#define R register
#define I 123456
using namespace std;
II ni1,ni2,yu1,yu2,ri1,ri2,sh1,sh2,fe1,fe2,n,ans;
II op[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
LO ko;
II a[I];
int main()
{
// freopen("1.in","r",stdin);
scanf("%d",&n);
for(R II i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d-%d-%d-%d:%d",&ni1,&yu1,&ri1,&sh1,&fe1);
scanf("%d-%d-%d-%d:%d",&ni2,&yu2,&ri2,&sh2,&fe2);
for(R II i=0;i<ni2;i++)
{
if((i%100!=0&&i%4==0)||(i%400==0)){
ko+=1440;
}
ko+=525600;
}
if((ni2%100!=0&&ni2%4==0)||(ni2%400==0)) {
if(yu2>=3) ko+=1440;
if(yu2==2&&ri2>=29) ko+=1440;
}
for(R II i=1;i<=yu2-1;i++) ko+=op[i]*1440;
// cout<<ko<<endl;
for(R II i=1;i<ri2;i++) ko+=1440;
ko+=sh2*60+fe2;
// cout<<ko<<endl;
for(R II i=0;i<ni1;i++)
{
if((i%100!=0&&i%4==0)||(i%400==0)){
ko-=1440;
}
ko-=525600;
}
if((ni1%100!=0&&ni1%4==0)||(ni1%400==0)) {
if(yu1>=3) ko-=1440;
if(yu1==2&&ri1>=29) ko-=1440;
}
for(R II i=1;i<=yu1-1;i++) ko-=op[i]*1440;
for(R II i=1;i<ri1;i++) ko-=1440;
ko-=sh1*60+fe1;
// cout<<ko<<endl;
sort(a+1,a+n+1);
for(R II i=1;i<=n&&ko>=a[i];i++)
{
ans++;
ko-=a[i];
}
printf("%d\n",ans);
exit(0);
}
by pretend-fal
END;