- 链接在此。
- 依旧是一本通蓝书模板题,具体证明去看书。
思路
- 首先想明白一点,要让总时长最短,那就必须要求空闲时间最短。
- 好吧我承认剩下的我讲不明白了,所以详见代码和注释。
#include<bits/stdc++.h>
using namespace std;
int ans[1010],n,k,t,a[1010];
int b[1010],m[1010],s[1010];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
m[i]=min(a[i],b[i]),s[i]=i;
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if(m[i]>m[j]){
swap(m[i],m[j]);swap(s[i],s[j]);
}
k=0,t=n+1;
for(int i=1;i<=n;i++)
if(m[i]==a[s[i]]) ans[++k]=s[i];
else ans[--t]=s[i];
k=0,t=0;
for(int i=1;i<=n;i++){
k+=a[ans[i]];
t=max(t,k);
t+=b[ans[i]];
}
printf("%d\n",t);
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
return 0;
}