求 hack
查看原帖
求 hack
697945
Tian36309楼主2024/12/28 16:52

rt WA #5

#include<bits/stdc++.h>
using namespace std;
struct Q{
	int day,sum;
	bool operator < (const Q& a) const {return sum > a.sum;}
	bool operator > (const Q& a) const {return sum < a.sum;}
};
priority_queue<Q> q;
int n;
int a[200005],fa[200005],vis[200005],fine[200005];
bool same;
int f[100005];
long long ans;
void solve(int k){
	int p=0;
	int t=0;
	for(p=k;p;p=fa[p]){
		f[++t] = p;
	}
	if(t >= 2)same = false;
	for(int i=1;i<=t;i++){
		if(i <= t/2){
			ans += a[f[i]];
			fine[f[i]] = 1;
		}
		if(i > t-(t/2)){
			ans -= a[f[i]];
			fine[f[i]] = 1;
		}
	}
	return;
}
void find(){
	same = true;
	for(int i=1;i<=n;i++){
		while(!q.empty()){
			Q x = q.top();
			if(x.sum > a[i]) break;
			q.pop();
			if(!vis[x.day]){
				vis[x.day] = 1;
				fa[i] = x.day;
				break;
			}
		}
		q.push({i,a[i]});
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			solve(i);
		}
	}
	if(same) return;
	int newn=0;
	for(int i=1;i<=n;i++){
		if(!fine[i]) a[++newn] = a[i];
	}
	if(newn <= 1)return;
	for(int i=1;i<=newn;i++){
		fa[i] = fine[i] = vis[i] = 0;
	}
	n = newn;
	find();
	return;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	find();
	printf("%lld\n",ans);
	return 0;
}

简单解释一下,大致思路就是对于每一天,选择前面最小的买入股票的一天买入股票并于这一天卖出,然后统计收益,再将没有参与买卖的部分加入一个新的数组数组重复以上操作,直到剩余序列单调不降

想知道是思路错了还是代码有问题

2024/12/28 16:52
加载中...