?? sched.cpp
字號:
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
//求兩個數的最大值
#define max(x, y) ((x)>(y)?(x):(y))
class Task
{
public:
int A;
int B;
bool operator < (Task q) const//重載"<"
{
return A<q.A || A==q.A&&B<q.B;
}
};
int main()
{
int i, j,best,tmp_min, n, p, q, current_task_index,index;
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
scanf("%d", &n);
Task *jobs=new Task [n];
Task *t=new Task [10*n];//用來存放動態規劃過程中可能的狀態
Task *tmp_best=new Task [10*n];//保存剪枝剩下的狀態
for (i = 0; i < n; i++)
scanf("%d", &jobs[i].A);
for (i = 0; i < n; i++)
scanf("%d", &jobs[i].B);
tmp_best[0].A = tmp_best[0].B = 0;
current_task_index = 1;
for (i = 0; i < n; i++)
{
index= 0;
//cout<<"i="<<i+1<<endl;
//cout<<"current_task_index="<<current_task_index<<endl;
for (j = 0; j < current_task_index; j++)//任務可能的分配情況
{
t[index].A = tmp_best[j].A + jobs[i].A;
t[index].B = tmp_best[j].B;
t[index+1].A = tmp_best[j].A;
t[index+1].B = tmp_best[j].B+ jobs[i].B;
//cout<<t[index].A<<" "<<t[index].B<<endl;
//cout<<t[index+1].A<<" "<<t[index+1].B<<endl;
index+=2;
}
sort(t, t+index);//先按照A的大小,如果A一樣的話,按照B的大小從小到大排好序
tmp_best[0] = t[0];
current_task_index = 1; tmp_min = t[0].B;
//cout<<"剪枝后的狀態"<<endl;
//cout<<t[0].A<<" "<<t[0].B<<endl;
for (j = 1; j <index; j++)
if (t[j].B < tmp_min)//不剪枝的條件
{
//數組tmp_best[]保存剪枝后剩下的狀態
tmp_best[current_task_index++] = t[j];//current_task_index記錄當前剪枝后剩下的狀態個數
//cout<<t[j].A<<" "<<t[j].B<<endl;
tmp_min = t[j].B;
}
}
best=INT_MAX;
//求所有較大值里面的最大值
for (i = 0; i < current_task_index; i++)
{
j=max(tmp_best[i].A,tmp_best[i].B);//取機器A和機器B中時間較大的
if (j <best)best=j;
}
printf("%d\n",best);
delete []tmp_best;
delete []t;
delete []jobs;
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -