求助,玄关
查看原帖
求助,玄关
550577
ForwardStar楼主2023/8/29 20:05

样例没过,感觉是弹出队头有问题。

#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
const int N=5e4,inf=2147483647;
int n,m;
struct land{
	int w,l;
}a[N],b[N];
int q[N],f[N];
int head=1,tail;
bool cmp(land x,land y){
	return x.w==y.w?x.l>y.l:x.w>y.w;
}
double slope(int x,int y){
	return 1.0*(f[x]-f[y])/(a[x+1].w-a[y+1].w==0?1e-9:a[x+1].w-a[y+1].w);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d%d",&a[i].w,&a[i].l);
	sort(a+1,a+1+n,cmp);
	int mx=1;
	b[++m]=a[1];
	for(int i=2;i<=n;i++){
		if(a[i].l>a[mx].l){
			b[++m]=a[i];	
			mx=i;
		}
	}
	for(int i=1;i<=m;i++)printf("%d %d\n",a[i].w,a[i].l);
	for(int i=1;i<=m;i++){
		while(tail>head&&slope(i-1,q[tail])<=slope(q[tail],q[tail-1]))tail--;
		q[++tail]=i-1;
		while(tail>head&&slope(q[head+1],q[head])<=b[i].l)head++;
		int j=q[head];
		f[i]=f[j]+b[j+1].w*b[i].l;
//		printf("%d %d %d\n",head,tail,f[i]);
	}
	printf("%d\n",f[m]);

	return 0;
}

2023/8/29 20:05
加载中...