题解 P1248 【加工生产调度】
第一篇蓝题题解
其实这道题就是考的Johnson算法的应用(废话嘛这不是),具体的证明楼上大佬已经给出,蒟蒻只是按照自己的理解打了一遍,试试嘛。
对了,还有一位巨佬(应该是位小姐姐 嘿嘿嘿)在简书上写了一个关于Johnson算法的文章,很有助于理解。大家可以去看看。
具体地址如下 404 Not Found
#include <iostream>
#include <algorithm>
using namespace std;
5truct Node
{
int a1, b1;
int time; //time=1 a1>a2 为什么使用这个time?
int minn; //其实在后面的cmp函数中可以看到,我利用了
// sort去按照time=1和2进行了排序
int order;//而作为bool类型的time是无法使用sort进行排序的
//所以。。。我使用int time=1或2;来代替“是”和“否”这两种情况
}; //我们可以利用struct。。。可以把所要用的东西放在一起,减少思维记忆量。。。(其实就是懒)(大雾)
inline bool cmp(Node a,Node b)
{
if (a.time != b.time)
{
return (a.time < b.time);
}
else if (a.time == 1)
{
return (a.a1 < b.a1);
}
return (a.b1 > b.b1);
}//很好理解对吧(弥天大雾)
Node st[100o1];
int main()
{
int n;
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>st[i].a1;
st[i].order=i;
}
for (int i=1;i<=n;i++)
{
cin>>st[i].b1;
}
for (int i=1;i<=n;i++)
{
st[i].minn= min(st[i].a1, st[i].b1);
if(st[i].minn==st[i].a1)
{
st[i].time=1;
}
else
{
st[i].time=2;// 对time进行处理
}
}
sort(st+1, st+1+n, cmp);
long long ta= st[1].a1, tb= st[1].b1+ta;
for (int i=2;i<=n;i++)
{
ta+=st[i].a1;
tb=max(ta,tb)+st[i].b1;//模拟求和,很简单(伸手不见五指雾)
}
cout<<tb;
cout<<endl;
for(int i=1;i<=n;++)
{
cout<<st[i].order<<" ";
}
return o;
}
感谢大家的观看♪(・ω・)ノ
欢迎大家指出我的错误(确实有哦)