有没有人给我个思路这样写怎么去重QAQ
查看原帖
有没有人给我个思路这样写怎么去重QAQ
648623
hema5177楼主2025/8/3 16:47

我的思路是先把所有只有一个时刻的求出来,然后再考虑移动每一朵玫瑰。

移动的时候我先加上玫瑰不是一个时刻开放的时间,然后再加上玫瑰与后面的花重叠时刻只有2朵花开放的(只判断了i+1与i+2),然后又判断了与前面的花重叠时刻只有2朵花开放的(只判断了i-1与i-2),但是中间i+1与i-1重叠之类的东西我就不会去重了…

因为感觉情况很多,比如可能重叠部分并没有完全算上去…来个人救救我吧QAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,m,t[200005],ans,max1=-1e9,s[200005];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>t[i];
	sort(t+1,t+n+1);
	if(n<=2)
	{
		cout<<n*m;
		return 0;
	}
	for(int i=1;i<=n;i++)
	{
		long long now=ans;
		if(i==1&&t[i+1]-t[i]<m) ans+=t[i+1]-t[i];
		else if(i==1) ans+=m;
		if(i==n&&t[i]-t[i-1]<m) ans+=t[i]-t[i-1];
		else if(i==n) ans+=m;
		//cout<<i<<":"<<ans<<endl;
		s[i]=ans-now;
		if(i==1||i==n) continue;
		if(t[i+1]-t[i]<m)
		{
			ans+=t[i+1]-t[i];
			if(t[i]-t[i-1]<m&&m-(t[i]-t[i-1])+m-(t[i+1]-t[i])<=m) ans-=m-(t[i]-t[i-1]);
			else if(t[i]-t[i-1]<m) ans-=t[i+1]-t[i];
		}
		else
		{
			ans+=m;
			if(t[i]-t[i-1]<m) ans-=m-(t[i]-t[i-1]);
		}
		s[i]=ans-now;
	}
	t[0]=-1e9,t[n+1]=1e9;
	for(int i=1;i<=n;i++)
	{
		long long sum=ans;
		if(i==1&&t[i+1]-t[i]<m||i==n&&t[i]-t[i-1]<m||i!=1&&i!=n&&(t[i+1]-t[i]<m||t[i]-t[i-1]<m)) sum+=m-s[i];
		if(i==1||i==n)
		{
			if(i==1&&t[i+1]-t[i]<m&&t[i+2]-t[i+1]<m) sum+=min(m-(t[i+1]+m-t[i+2]),t[i]+m-t[i+1]);
			else if(i==1&&t[i+1]-t[i]<m) sum+=t[i]+m-t[i+1];
			if(i==n&&t[i]-t[i-1]<m&&t[i-1]-t[i-2]<m) sum+=min(m-(t[i-2]+m-t[i-1]),t[i-1]+m-t[i]);
			else if(i==n&&t[i]-t[i-1]<m) sum+=t[i-1]+m-t[i];
			max1=max(max1,sum);
			continue;
		}
		if(t[i+1]-t[i]<m&&t[i+2]-t[i+1]<m) sum+=min(m-(t[i+1]+m-t[i+2]),t[i]+m-t[i+1]);
		else if(t[i+1]-t[i]<m) sum+=t[i]+m-t[i+1];
		if(t[i]-t[i-1]<m&&t[i-1]-t[i-2]<m) sum+=min(m-(t[i-2]+m-t[i-1]),t[i-1]+m-t[i]);
		else if(t[i]-t[i-1]<m) sum+=t[i-1]+m-t[i];
		//if(sum>ans+2*m) sum=ans+2*m;
		//if(t[i-1]+m-t[i+1]>0) sum-=t[i-1]+m-t[i+1];
		max1=max(max1,sum);
		//cout<<i<<":"<<sum<<endl;
	}
	cout<<max1;
}
2025/8/3 16:47
加载中...