解题思路:
这是一道很经典的题,只需要记住这种题型的一个结论:
A机器上加工时间短的任务应优先,而在B机器上加工时间短的任务应该排在后面
注意事项:
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int id;
int t;
}m[10000];
int main()
{
int n;cin>>n;
int a[10000],b[10000];
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++){m[i].id=i; m[i].t=min(a[i],b[i]);}
for(int i=1;i<=n-1;i++) //好像只有选择排序才让过
for(int j=i+1;j<=n;j++)
if(m[i].t>m[j].t)
{
swap(m[i].t,m[j].t);
swap(m[i].id,m[j].id);
}
int r=n,l=1;
int ans[10000];//加工顺序
for(int i=1;i<=n;i++){
if(m[i].t==a[m[i].id]){ans[l]=m[i].id;l++;}
else {ans[r]=m[i].id;r--;}
}
int sum1=0,sum2=0;
for(int i=1;i<=n;i++){ //背诵+记忆
//还没有加工第i个的第二道程序之前总时间取决于sum1和sum2的最大值
sum1+=a[ans[i]];
sum2=max(sum1,sum2);
//之后在执行第二道工序
sum2+=b[ans[i]];
}
cout<<sum2<<endl;
for(int i=1;i<n;i++){
cout<<ans[i]<<" ";
}
cout<<ans[n]<<endl;
return 0;
}
0.0分
1 人评分
程序员的表白 (C语言代码)浏览:1575 |
C语言程序设计教程(第三版)课后习题8.1 (Java代码)浏览:828 |
【回文数(二)】 (C++代码)浏览:932 |
C语言训练-排序问题<1> (C语言代码)浏览:636 |
printf基础练习2 (有点不明白)浏览:887 |
【排队买票】 (C语言代码)浏览:944 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:606 |
WU-陶陶摘苹果2 (C++代码)浏览:1018 |
简单的a+b (C语言代码)浏览:661 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:590 |