1 条题解
-
0
贪心
一个很直白的排序方法是:A生产线快的先做,B生产线快的后做
理由是什么呢:
- ①我们先放在生产线A,再放到生产线B,A生产线时间是不论怎样都是不变的,因此我们只需让B生产线早点开始早点结束
- ②B生产线早点开始,意思就是A生产线尽可能快的出产品,因此我们要把A生产线快的产品放到前面
- ③B生产线早点结束,我们只需要让A出来的产品不要排队等待进入B产品,因此我们要把B生产线快的产品放到后面
这是定性的证明,定量的证明参见:
本题难点无非就是cmp函数的编写,可知排序不仅仅和最小值有关,还跟最小值出现的位置有关,这在我们的结构体中需要一个变量来存放,然后分类讨论即可
#include <bits/stdc++.h> using namespace std; const int N = 1005; int n; struct Node { int a; int b; int id; int tmin; int d; bool operator < (const Node &x)const { if(d == x.d) { if(d<=0) return a<x.a; else return b>x.b; } return d<x.d; } }ob[N]; int main() { cin >> n; for(int i=1;i<=n;i++) { ob[i].id = i; cin >> ob[i].a; } for(int i=1;i<=n;i++) { cin >> ob[i].b; ob[i].tmin = min(ob[i].a,ob[i].b); if(ob[i].a<ob[i].b) ob[i].d = -1; else if(ob[i].a == ob[i].b) ob[i].d = 0; else ob[i].d = 1; } sort(ob+1,ob+n+1); int fa = 0,fb = 0; for(int i = 1;i<=n;i++) { fa+=ob[i].a; fb = max(fb,fa); fb+=ob[i].b; } cout << fb << endl; for(int i=1;i<n;i++) { cout << ob[i].id << " "; } cout << ob[n].id; return 0; }
- 1
信息
- ID
- 497
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 3
- 标签
- 递交数
- 42
- 已通过
- 23
- 上传者