贪心。
###一、主算法
- 此题用贪心(很明显这个没必要吧...这个全局最优每一步一定是最优的阿
- 考虑两个零件
 有以下情况:
 1.先生产:
 2.先生产:
- 此时神奇的想到了如下算法:
 根据此规则,对数组进行排序,即:
 其中此规则在中有所体现(即中就是按照这个来决定的前后顺序的)sort(a+1,a+n+1,cmp);
- 不愧是,他水过去了!
- 但是据题解,这种算法是错的,然而尴尬的是我也不知道为什么是错的阿
###二、正解()
我来为某威代言了
- 排序方式
  
 这里解释下,以为关键字排序即最终顺序依次是,,
 放个小小的:inline int cmp(Node x,Node y){ if(x.c!=y.c) return x.c<y.c; if(x.c!=1) return x.a<y.a; return x.b>y.b; }
- 为什么这么排序呢?
 因为你要使得总时间最小,机器工作的时间一定是固定的,那么就要让等待的时间尽量的小
- 这里举一个例子,如果有两个东西分别是和
 先做第一个的话耗时
 先做第二个的话耗时
 现在应该很好理解为什么的放在前面比较好了吧
 具体的证明就不证明了,感性理解下就是如果把的放在前面可以让结束时间尽可能的早,便于更快的生产,尽可能少的出现过多的等待情况。
- 这就是所有题目的思路啦!后面的具体最小时间模拟即可,注意的初始值阿。
###三、代码
#include <bits/stdc++.h>
#define ll long long
#define maxn 1001
using namespace std;
ll n,ta,tb;
struct Node{
    ll a,b,c,num;
}w[maxn];
inline ll read(){
    ll x=0,f=0;
    char c=getchar();
    while(!isdigit(c))
        f|=c=='-',c=getchar();
    while(isdigit(c))
        x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return f?-x:x;
}
inline int cmp(Node x,Node y){
    if(x.c!=y.c)
       return x.c<y.c;
    if(x.c!=1)
        return x.a<y.a;
    return x.b>y.b;
}
int main(){
    n=read();
    for(register int i=1;i<=n;++i){
        w[i].a=read();
        w[i].num=i;
    }        
    for(register int i=1;i<=n;++i)
        w[i].b=read();
    for(register int i=1;i<=n;++i)
        if(w[i].a<w[i].b)
            w[i].c=-1;
        else if(w[i].a==w[i].b)
            w[i].c=0;
        else    
            w[i].c=1;
    sort(w+1,w+n+1,cmp);
    ta=w[1].a;
    tb=w[1].a+w[1].b;
    for(register int i=2;i<=n;++i){
        tb=max(ta+w[i].a,tb)+w[i].b;
        ta+=w[i].a;
    }
    printf("%lld\n",tb);
    for(register int i=1;i<=n;++i)
        printf("%lld ",w[i].num);
}
小知识:又双叒叕
 
    