Luogu P1248 加工生产调度

题目
1、(a_le b_i)的在前面。
显然。
2、前面的按(a_i)升序排序。
这样会尽可能地让要等的时间变少。
3、后面的按(b_i)降序排序。
反过来看,跟2一样。
真要严格证明的话交换法吧。

#include<bits/stdc++.h>
using namespace std;
const int N=1007;
int read(){int x;scanf("%d",&x);return x;}
int a[N],b[N],p[N],q[N],f[N];
int cmp1(int i,int j){return a[i]<a[j];}
int cmp2(int i,int j){return b[i]>b[j];}
int main()
{
    int n=read(),i,c1=0,c2=0,ta=0,tb=0;
    for(i=1;i<=n;++i) a[i]=read();
    for(i=1;i<=n;++i) b[i]=read();
    for(i=1;i<=n;++i) if(a[i]<=b[i]) p[++c1]=i; else q[++c2]=i;
    sort(p+1,p+c1+1,cmp1),sort(q+1,q+c2+1,cmp2);
    for(i=1;i<=c1;++i) f[i]=p[i];
    for(i=1;i<=c2;++i) f[i+c1]=q[i];
    for(i=1;i<=n;++i)
    {
	ta+=a[f[i]];
	if(tb>ta) tb+=b[f[i]]; else tb=ta+b[f[i]];
    }
    printf("%d
",tb);
    for(i=1;i<=n;++i) printf("%d ",f[i]);
}
原文地址:https://www.cnblogs.com/cjoierShiina-Mashiro/p/11578623.html