因为特判写了79行。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
int sleep,head=1,n,x,p,q,r,allsleep[1000000+10],ans,a[1000000+10],num;
bool flag = false;
int fracadd(int s)
{
s = s*p;
int t = s;
s = s/q;
if (q*s!=t) s+=1;
return s;
}
int main()
{
scanf ("%d %d %d %d", &n, &x, &p, &q);
for (int i=1;i<=n;i++)
{
scanf ("%d", &a[i]);
}
sleep = x;
for (int i=1;i<=n;)
{
flag = false;
while (sleep-num-a[i]>0&&sleep-num-a[i]>=fracadd(x*i))
{
flag = true;
sleep -= a[i];
a[i] = -1;
i+=1;
head = i;
}
if (flag==true)
{
i-=1;
head-=1;
}
ans+=1;
break;
}
allsleep[head] = sleep;
for (int i=1;i<=n;i++)
{
flag = false;
if (a[i]==-1)
{
continue;
}
else if (allsleep[head]<fracadd(i*x))
{
allsleep[i]=x+allsleep[head];
head = i;
ans+=1;
continue;
}
num = 0;
sleep = x;
while (x-num-a[i]>0&&a[i]!=-1&&i<=n)
{
flag = true;
i+=1;
num += a[i-1];
}
if (flag==true)i-=1;
allsleep[i] = allsleep[head]+x-num;
head = i;
if (flag==false)
{
allsleep[i] = allsleep[head]+x;
head = i;
}
ans+=1;
}
printf ("%d\n", ans);
return 0;
}
样例过了,数据包里#4没过,剩下的没试