T3 TLE 2个点求优化
查看原帖
T3 TLE 2个点求优化
366179
dengyujie2020楼主2022/9/4 18:20

代码

#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;
}

求大佬优化

2022/9/4 18:20
加载中...