应该都是少算了一天,想不出反例。
#include<iostream>
#include<math.h>
#define N 100005
using namespace std;
long long n, ans = 1;
long double x, p, q, r, t[N], wrk, tot, tmp, num;
// wrk为当前剩余的工作时间,tot为当天连续工作时间
int main(){
scanf("%lld%Lf%Lf%Lf", &n, &x, &p, &q);
r = p / q, tmp = wrk = x * (1.0 - r);
for(int i = 1; i <= n; i++){
scanf("%Lf", &t[i]);
if(wrk < t[i]){//工作时间不够了
num = (t[i] - wrk) / tmp, ans += ceil(num);//ans加上补觉的天数
wrk += ceil(num) * tmp, tot = 0;//工作时间加上养精蓄锐的补觉时间
//连续工作时间清零
}
tot += t[i];//连续工作时间加上此任务所需时间
if(x - tot <= 0) ans++, wrk += x - tot + tmp, tot = t[i];//一天没睡觉就下一天做
else wrk -= t[i];//还能做就做
}
printf("%lld", ans);
return 0;
}
如果任务在这天睡觉前能做完就做,如果下一个任务今天做不完了就先睡,然后把多睡的时间加给第二天的工作时间;如果连续做的任务时间加起来比一天的时间还要多(即一天没睡觉),就把当前做的最后一个任务放到明天去做,然后明天的工作时间加上今天剩下睡觉的时间。