超级玄学做法
查看原帖
超级玄学做法
882193
Blue_Flower楼主2023/12/2 21:54

脑回路清奇的我看完题马上想到了如下代码,想法就是用 f1[i] 表示过了 i-1 天后可提交的木材总长度, f2[i] 表示过了 i-1 天后可以提交的木材生长速度之和,最后枚举天数,至于如何处理看代码吧(没有 TLE 但是 WA 75pts),请问这个做法错误在哪里,或者说代码哪里没写好?

大佬 orz

#include<bits/stdc++.h>
#define ll long long
#define N 200000
using namespace std;
int n;
ll s,l,h[N],a[N],ans=N*100;
ll f1[N*100],f2[N*100];

inline ll read(void)
{
	ll x=0;
	char c=getchar();
	while(c>'9'||c<'0') c=getchar();
	while(c<='9'&&c>='0')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}

int main(void)
{
	n=read();s=read();l=read();
	for(int i=1;i<=n;i++) h[i]=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		ll x=l-h[i];
		ll c;
		if(x<0) c=0;
		else c=x/a[i];
		if(c*a[i]<x) c++;
		if(c<=N*100)
		{
		    f1[c+1]+=h[i]+c*a[i];
		    f2[c+1]+=a[i];
	    }
	}
	if(f1[1]>=s)
	{
		cout<<0<<endl;return 0;
	}
	for(ll i=2;;i++)
	{
		f1[i]+=f1[i-1]+f2[i-1];
		f2[i]+=f2[i-1];
		if(f1[i]>=s)
		{
			cout<<i-1<<endl;return 0;
		}
	}
	return 0;
}
2023/12/2 21:54
加载中...