活跃农民
- 积分
- 380
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2014-7-20
- 最后登录
- 1970-1-1
|
class Solution481 {
public:
class Machine {
public:
int remains;
int index;
int runtimes;
Machine(int remains, int index) {
this->remains=remains;
this->index=index;
this->runtimes=0;
}
};
struct mycompare {
public:
bool operator()(Machine& a, Machine& b) {
return a.runtimes<b.runtimes ||
(a.runtimes==b.runtimes && a.remains<b.remains) ||
(a.runtimes==b.runtimes && a.remains==b.remains && a.index<b.index);
}
} mycompare;
int greedyScheduling(vector<int> rebootTimes, vector<int> jobs) {
sort(jobs.begin(), jobs.end());
vector<Machine> machines;
for (int i=0; i<rebootTimes.size(); i++) {
Machine mach(rebootTimes[i], i);
machines.push_back(mach);
}
vector<int> workTime(rebootTimes.size(), 0);
for (int i=0; i<jobs.size(); i++) {
sort(machines.begin(), machines.end(), mycompare);
Machine* curr=findSmallestBigger(jobs[i], machines);
if (curr==NULL) {
return -1;
}
curr->remains-=jobs[i];
curr->runtimes++;
}
int output=0;
for (int i=0; i<machines.size(); i++) {
output=max(output, rebootTimes[machines[i].index]-machines[i].remains);
}
return output;
}
void test() {
vector<int> machines={40, 40, 40};
vector<int> jobs={3,5,6,10,11,14,15,18,20};
cout<<greedyScheduling(machines, jobs);
}
private:
Machine* findSmallestBigger(int job, vector<Machine>& machines) {
for (int i=0; i<machines.size(); i++) {
if (machines[i].remains>=job) {
return &(machines[i]);
}
}
return NULL;
}
};
这是我的贪心算法,不过每次都要有个排序 |
|