1167刷题
1.- 1.- 1. 是一道大模拟,也不算太大。但需要注意的细节挺多的。 注意分类讨论,考虑特殊值。 看代码:
#include< iostream>
#include< cmath>
#include< cstdio>
#include< cmath>
#include< algorithm>
#include< cstring>
using namespace std;
#define xx 10010
int n,a[ xx ],existx,existy,ta,tt;
long long sum;
int mouth[ 13 ]={0,1,2,1,0,1,0,1,1,0,1,0,1};
//用于判断大小月
int ya,ma,timea,da,yb,mb,timeb,db;
//起始年月日,终止年月日。
char p[ 31 ],q[ 31 ];
//用字符存年月日。
bool cmp( int a,int b )
{
return a<b;
}
int lx(int u)
{//判断是否为闰年。
if(abs(u-2000)%4==0)
{
return 1;
}
else return -1;
}
void runyear(int x)
{
if(x==1)
{
int u=((int)p[0]-48)*1000+((int)p[1]-48)*100+((int)p[2]-48)*10+((int)p[3]-48);
ya=u;//字符换成整形变量存储。
if(lx(u)==1)
existx=1;//记录起始年是否为闰年。
}
else//记录终止年。
{
int u=((int)q[0]-48)*1000+((int)q[1]-48)*100+((int)q[2]-48)*10+((int)q[3]-48);
yb=u;
if(lx(u)==1)
existy=1;
}
}
void init()
//将月 日 时 分都换为整形。
{
//如果p[0]是1【字符型】,(int)p[0]-48=1【整形】
ma=(int)p[5]*10-480+(int)p[6]-48;
mb=(int)q[5]*10+(int)q[6]-480-48;
da=(int)p[8]*10+(int)p[9]-480-48;
db=(int)q[8]*10+(int)q[9]-480-48;
timea=(((int)p[11]-48)*10+((int)p[12]-48))*60+(int)p[14]*10+(int)p[15]-480-48;
timeb=(((int)q[11]-48)*10+((int)q[12]-48))*60+(int)q[14]*10+(int)q[15]-480-48;
}
void lm()
//将月化为天数差。
{
if(ya!=yb)//起止年不同时
{
for(int i=1;i<=mb-1;++i)
{
if(mouth[i]==0)
sum+=30;
if(mouth[i]==1)
sum+=31;
if(mouth[i]==2)
{
if(existy==1)
sum+=29;
else
sum+=28;
}
}
sum+=db-1;//注意减1!!
for(int i=12;i>=ma+1;--i)
{
if(mouth[i]==0)
sum+=30;
if(mouth[i]==1)
sum+=31;
if(mouth[i]==2)
{
if(existx==1)
sum+=29;
else sum+=28;
}
}
if(mouth[ma]==0) sum=sum+30-da;
if(mouth[ma]==1) sum=sum+31-da;
if(mouth[ma]==2)
{
if(existx==1) sum=sum+29-da;
else sum=sum+28-da;
}
}
if(ya==yb&&ma!=mb) //年相同月不同时。
{
for(int i=ma+1;i<=mb-1;++i)
{
if(mouth[i]==0)
sum+=30;
if(mouth[i]==1)
sum+=31;
if(mouth[i]==2)
{
if(existy==1)
sum+=29;
else
sum+=28;
}
}
if(mouth[ma]==0) sum=sum+30-da;
if(mouth[ma]==1) sum=sum+31-da;
if(mouth[ma]==2)
{
if(existx==1) sum=sum+29-da;
else sum=sum+28-da;
}
sum+=db-1;
}
}
void ltime()//计算小时的差。
{
if(ma==mb&&ya==yb&&da==db)
{
sum+=(timeb-timea);
}
else
{
sum=sum+(24*60-timea)+timeb;
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
{
cin>>a[i];
}
for(int i=0;i<=15;++i)
{
cin>>p[i];
}
for(int i=0;i<=15;++i)
{
cin>>q[i];
}
sort(a+1,a+1+n,cmp);
runyear(1);runyear(2);init();
for(int i=ya+1;i<=yb-1;++i)
{
if(lx(i)==1)
sum+=366;
if(lx(i)==-1)
sum+=365;
}//计算起止年间差多少天。
lm();sum=sum*24*60;//化天为分钟。
ltime();
while(sum>0&&ta<=n-1)
{
sum-=a[++ta];
if(sum>=0)
{
tt++;
}
}
cout<<tt<<'\n';
return 0;
}