思路
不得不说这个排序方法真的很妙。
设定每个零件有x,y,id,分别表示在A车间加工时间,在B车间加工时间,以及编号。
我们比较两个零件的优先级时,加入A应该在B之前加工,那么A.x+B.y+max(A.y,B.x)<B.x+A.y+max(A.x,B.y)
已知min(x,y)+max(x,y)=x+y,那么上式就可以化为min(A.x,B.y)<min(A.y,B.x);
我们以这个规则对所有零件进行排序(如果存在相等的情况,那么优先加工A区间加工时间少的),
问题就解决啦!
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int maxn=2005;
int n;
struct E{
int x,y,id; //记录每个零件
}s[maxn];
bool cmp(E a,E b){
int i= min(a.x,b.y),j=min(a.y,b.x);
if(i==j) return a.x<b.x; //没有这一步只能过洛谷不能过牛客
return i<j;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) s[i].id=i;
for(int i=1;i<=n;i++) cin>>s[i].x;
for(int i=1;i<=n;i++) cin>>s[i].y;
sort(s+1,s+1+n,cmp); //排序
int tmp=0,sum=0;//tmp为B车间的工作时间
for(int i=1;i<=n;i++){
tmp-=s[i].x;
if(tmp<0) tmp=0;
tmp+=s[i].y;
sum+=s[i].x;
}
sum+=tmp; //A车间工作完后B车间还需工作tmp
cout<<sum<<"\n";
for(int i=1;i<=n;i++){
cout<<s[i].id<<" ";
}
return 0;
}

京公网安备 11010502036488号