因为t都是正整数,所以前缀和应该是单调递增的,想到二分答案,但是调了很久出不来qwq,只能交个暴力,没想到暴力有70。
如果思路没错求调。
#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
int t[100005],s[100005];
double sleep;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
inline void writeln(int x){write(x);putchar('\n');}
inline void writesp(int x){write(x);putchar(' ');}
signed main()
{
// freopen("task5.in","r",stdin);
// freopen("task5.out","w",stdout);
int n=read(),x=read(),p=read(),q=read(),m=1;
// cin>>n>>x>>p>>q;
int g=__gcd(p,q);q/=g,p/=g;
for(int i=1;i<=n;i++)
t[i]=read(),s[i]=s[i-1]+t[i];
double r=p*1.0/q;
int d=0;
while(m<=n)
{
d++;
double st=r*x*d-sleep,time=x-st;
if(st<=0) time=x,st=0;
if(time<=0)
{
sleep+=x;
continue;
}
sleep+=st;
//二分部分
// int l=m,ri=n,now=-1;
// while(l<=ri)
// {
// int mid=(l+ri)/2;
// int used=s[mid]-s[m-1];
// if(used<=time&&st+time-used>0)
// {
// l=mid+1;
// now=mid;
// }
// else ri=mid-1;
// }
//暴力
// for(int i=m;i<=n;i++)
// {
// if(t[i]<=time&&st+time-t[i]>0)
// {
// time-=t[i];
// m++;
// }
// else break;
// }
// time-=(s[now]-s[m-1]);二分对应
sleep+=time;
// if(now!=-1) m=now+1;二分对应
}
write(d);
return 0;
}