月赛T3二分做法求助
  • 板块学术版
  • 楼主紊莫turtle
  • 当前回复13
  • 已保存回复13
  • 发布时间2022/9/4 17:47
  • 上次更新2023/10/27 12:33:58
查看原帖
月赛T3二分做法求助
443675
紊莫turtle楼主2022/9/4 17:47

因为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;
}


2022/9/4 17:47
加载中...