加工生产问题

#include<bits/stdc++.h>

struct Str
{
  int w;
  int num;
};
int n;
int a[1010], b[1010];
Str s[5000];
int u, v;
int ans[1010];

bool cmp(Str x, Str y)
{
  return x.w < y.w;
}

int main(void)
{
  scanf("%d", &n);
  for(int k = 1;k <= n;k ++) scanf("%d", &a[k]);
  for(int k = 1;k <= n;k ++) scanf("%d", &b[k]);
  //读入

  for(int k = 1;k <= n;k ++) 
    s[k].w = std::min(a[k], b[k]), s[k].num = k;

  std :: sort(s+1, s+n+1, cmp);
  //结构体存储,s[k].w表示用的时间. s[k].num 表示其序号

  u = 0, v = n+1;
  for(int k = 1;k <= n;k ++)
    if(s[k].w == a[s[k].num])
      ans[++ u] = s[k].num;
    else
      ans[-- v] = s[k].num;
  //核心代码。也是我们刚刚讨论的算法的关键所在
  //ans数组存放的就是我们的最终处理序列

  u = 0, v = 0;
  for(int k = 1;k <= n;k ++)
  {
    u += a[ans[k]];

    if(v < u) v = u;
    v += b[ans[k]];
  }
  //统计用时.这里u表示a机器用时,v表示b机器用时,且每次v都被置为最大值.

  printf("%d\n", v);
  for(int k = 1;k <= n;k ++) printf("%d ", ans[k]);
  //输出

  return 0;
}

 

posted @ 2023-04-18 00:16  刘海烽  阅读(25)  评论(0)    收藏  举报