[luogu1248] 加工生产调度 题解

考虑 \(i\) 排在 \(j\) 前的条件是 \(a_i+\max(a_j,b_i)+b_j\le a_j+\max(a_i,b_j)+b_i\),然后发现这一坨东西是皇后游戏中的倒数第三个式子,直接转化为 \(\min(a_j,b_i)\ge\min(a_i,b_j)\),然后就按皇后游戏中的排序方法就可以了……

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
struct hand{
	int a,b,id;
}peo[1005];
int d(hand x){
	if(x.a==x.b) return 0;
	return ((x.a>x.b)?1:-1);
}int cmp(hand x,hand y){
	if(d(x)!=d(y)) return d(x)<d(y);
	if(d(x)>0) return x.b>y.b;
	return x.a<y.a;
}signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>peo[i].a;
	for(int i=1;i<=n;i++)
		cin>>peo[i].b,peo[i].id=i;
	sort(peo+1,peo+n+1,cmp);
	int s=0,c=0;
	for(int i=1;i<=n;i++){
		s+=peo[i].a;
		c=max(c,s)+peo[i].b;
	}cout<<c<<"\n";
	for(int i=1;i<=n;i++)
		cout<<peo[i].id<<" ";
	return 0;
} 
posted @ 2024-11-10 17:16  长安一片月_22  阅读(6)  评论(0编辑  收藏  举报