题目分析:
经典的流水作业调度问题 使用
J
o
h
n
s
o
n
Johnson
J o h n s o n 算法,设
N
1
为
a
<
b
的
集
合
,
N
2
为
a
>
=
b
的
集
合
,
将
N
1
按
照
a
非
减
序
排
序
,
N
2
按
照
b
非
增
序
排
列
,
则
N
1
作
业
接
N
2
作
业
为
最
优
决
策
N_1为a<b的集合,N_2为a>=b的集合,将N_1按照a非减序排序,N_2按照b非增序排列,则N_1作业接N_2作业为最优决策
N 1 为 a < b 的 集 合 , N 2 为 a > = b 的 集 合 , 将 N 1 按 照 a 非 减 序 排 序 , N 2 按 照 b 非 增 序 排 列 , 则 N 1 作 业 接 N 2 作 业 为 最 优 决 策
Code:
#include <bits/stdc++.h>
using namespace std;
#define maxn 1010
int n, a[ maxn] , b[ maxn] , ans[ maxn] ;
struct node {
int w, id;
} e[ maxn] ;
inline int read_ ( ) {
int x= 0 , f= 1 ;
char c= getchar ( ) ;
while ( c< '0' || c> '9' ) {
if ( c== '-' ) f= - 1 ;
c= getchar ( ) ;
}
while ( c>= '0' && c<= '9' ) {
x= ( x<< 1 ) + ( x<< 3 ) + c- '0' ;
c= getchar ( ) ;
}
return x* f;
}
inline bool cmp_ ( node aa, node bb) {
return aa. w < bb. w;
}
inline void work_ ( ) {
for ( int i= 1 ; i<= n; ++ i) {
e[ i] . w= min ( a[ i] , b[ i] ) ;
e[ i] . id= i;
}
sort ( e+ 1 , e+ 1 + n, cmp_) ;
int l= 0 , r= n+ 1 ;
for ( int i= 1 ; i<= n; ++ i) {
if ( e[ i] . w== a[ e[ i] . id] ) {
ans[ ++ l] = e[ i] . id;
}
else {
ans[ -- r] = e[ i] . id;
}
}
l= 0 , r= 0 ;
for ( int i= 1 ; i<= n; ++ i) {
int u= ans[ i] ;
l+ = a[ u] ;
if ( r< l) r= l;
r+ = b[ u] ;
}
printf ( "%d\n" , r) ;
for ( int i= 1 ; i<= n- 1 ; ++ i) {
printf ( "%d " , ans[ i] ) ;
}
printf ( "%d" , ans[ n] ) ;
}
void readda_ ( ) {
n= read_ ( ) ;
for ( int i= 1 ; i<= n; ++ i) {
a[ i] = read_ ( ) ;
}
for ( int i= 1 ; i<= n; ++ i) {
b[ i] = read_ ( ) ;
}
work_ ( ) ;
}
int main ( ) {
freopen ( "a.txt" , "r" , stdin ) ;
readda_ ( ) ;
return 0 ;
}