求调,用浮点数就WA#28(P8508做不完的作业)
查看原帖
求调,用浮点数就WA#28(P8508做不完的作业)
490694
Compound_Interest楼主2022/9/10 18:18
#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
#define eps 1e-7
using namespace std;
const int maxn=1e5+10;
int n,x,p,q,a[maxn],sum,ans;
int gcd(int xx,int yy){
	if(!yy) return xx;
	return gcd(yy,xx%yy);
}
signed main(){
	//freopen("task5.in","r",stdin);
	//freopen("my.out","w",stdout); 
	scanf("%lld%lld%lld%lld",&n,&x,&p,&q);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	int now=1,g=gcd(p,q);
	p/=g,q/=g;
	long double r=1.0*p/q; 
	while(now<=n){
		ans++;
		int t=x;
		int sleep=max((long double)1ll*1.0,ceil(1.0*(1.0*x*ans*r)-1.0*sum));
		if(x-sleep>=a[now]){
			sum+=sleep;
			t-=sleep;
			while(t>=a[now]&&now<=n) t-=a[now],now++;
			sum+=t;
			//printf("ans=%lld sum=%lld t=%lld sleep=%lld now=%lld\n",ans,sum,t,sleep,now);
		}
		else{
			int tmp=0;
			long double delta=1.0*(1.0-r)*x;
			int day=ceil(1.0*(a[now]-(x-sleep))/delta);
			ans+=day-1,sum+=(day-1)*x;
			int slp=max((long double)1ll*1.0,ceil(1.0*(1.0*x*ans*r)-1.0*sum));
			sum+=slp,tmp+=slp;
			t-=slp;
			while(t>=a[now]&&now<=n) t-=a[now],now++;
			sum+=t,tmp+=t;
			//printf("sleep sevral days Ans=%lld sum=%lld t=%lld day=%lld slp=%lld now=%lld tmp=%lld\n",ans,sum,t,day,slp,now,tmp);
		}
	}
	printf("%lld",ans);
	return 0;
} 
2022/9/10 18:18
加载中...