代码
#include<bits/stdc++.h>
using namespace std;
double p,q,nst,nnt;
long long n,t[100000+50],ntst,day,nt,x;
int main()
{
cin>>n>>x>>p>>q;
for(int i=1;i<=n;i++)
scanf("%lld",t+i);
day=1;
ntst=1;
while(ntst<=n)
{
double nt=x;
while(ntst<=n)
{
//cout<<ntst<<" "<<nt<<" "<<endl;
if(nt>=t[ntst]&&nt-t[ntst]>0&&double(nt-t[ntst])>=p*1.0/q*x*day*1.0-nst)//可以做
nt=nt-t[ntst],ntst++;
else
break;
}
//printf("第%d天要睡%.2lf小时,还剩下%.2lf小时来睡觉,完成任务到%d个\n",day,p*1.0/q*x*day*1.0-nst,nt,ntst-1);
nst+=nt;
day++;
}
day--;
cout<<day;
return 0;
}
个人认为的优化思路:二分day的大小
如(这是赛场是没完成的蒟蒻代码):
#include<bits/stdc++.h>
using namespace std;
double p,q,nst;
long long n,t[100000+50],ntst,day,nt,x;
long long f(long long x)
{
long long l=x,r=(10*x+100),mid;
while(l<r)
{
mid=(l+r)/1;
if(double(nt-t[ntst])>=(p*1.0/q*x*mid*1.0-nst))
r=mid;
else
l=mid+1;
}
return l;
}
int main()
{
cin>>n>>x>>p>>q;
for(int i=1;i<=n;i++)
scanf("%lld",t+i);
day=1;
ntst=1;
while(ntst<=n)
{
double nt=x;
while(ntst<=n)
{
//cout<<ntst<<" "<<nt<<" "<<endl;
if(nt>=t[ntst]&&nt-t[ntst]>0&&double(nt-t[ntst])>=p*1.0/q*x*day*1.0-nst)//可以做
nt=nt-t[ntst],ntst++;
else
break;
}
//printf("第%d天要睡%.2lf小时,还剩下%.2lf小时来睡觉,完成任务到%d个\n",day,p*1.0/q*x*day*1.0-nst,nt,ntst-1);
nst+=nt;
day=f(day);
}
day--;
cout<<day;
return 0;
}
求大佬优化