| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
附代码……很长,但是应该不乱,哪位大牛帮我看看么?In Reply To:话说我这题到底是WA掉了还是超时了? Posted by:150014 at 2007-11-27 20:35:34 #include<cstdio>
#include<deque>
#include<algorithm>
using namespace std;
const int INF=2000000000;
class Memory{
public:
Memory();
bool ReadSize();
bool ReadTask();
bool Print();
private:
typedef pair<int,int> Block;
struct Task{
int blockSize,timeNeed,timeEnd;
Block allocate;
};
int size,currentTime,exitTime,waitCount;
deque<Block> pool;
deque<Task> running;
deque<Task> waiting;
bool TaskBegin(Task);
bool TaskEnd();
int PoolUsable(Task);
static bool BlockCompare(Block,Block);
static bool TaskEndEarly(Task,Task);
};
Memory::Memory(){
size=currentTime=exitTime=INF;
waitCount=0;
}
bool Memory::ReadSize(){
scanf("%d",&size);
pool.push_back(Block(0,0));
pool.push_back(Block(size,size));
return true;
}
bool Memory::ReadTask(){
Task current;
int time;
scanf("%d%d%d",&time,¤t.blockSize,¤t.timeNeed);
current.allocate.first=current.allocate.second=current.timeEnd=INF;
if(time==0 && current.blockSize==0 && current.timeNeed==0){
while(!waiting.empty())
TaskEnd();
return false;
}
while(!running.empty() && time>=running.begin()->timeEnd)
TaskEnd();
currentTime=time;
if(!TaskBegin(current)){
waiting.push_back(current);
waitCount++;
}
return true;
}
bool Memory::Print(){
printf("%d\n%d\n",exitTime,waitCount);
return true;
}
bool Memory::TaskBegin(Task newTask){
newTask.allocate.first=PoolUsable(newTask);
if(newTask.allocate.first==INF)
return false;
newTask.allocate.second=newTask.allocate.first+newTask.blockSize;
pool.push_back(newTask.allocate);
newTask.timeEnd=currentTime+newTask.timeNeed;
if(exitTime==INF || exitTime<newTask.timeEnd)
exitTime=newTask.timeEnd;
running.push_back(newTask);
sort(running.begin(),running.end(),TaskEndEarly);
return true;
}
bool Memory::TaskEnd(){
currentTime=running.begin()->timeEnd;
while(!running.empty() && running.begin()->timeEnd==currentTime){
pool.erase(find(pool.begin(),pool.end(),running.begin()->allocate));
running.pop_front();
}
while(!waiting.empty() && TaskBegin(waiting.front()))
waiting.pop_front();
return true;
}
int Memory::PoolUsable(Task newTask){
sort(pool.begin(),pool.end(),BlockCompare);
for(int ptr=0;ptr<pool.size()-1;ptr++)
if(pool[ptr+1].first-pool[ptr].second>=newTask.blockSize)
return pool[ptr].second;
return INF;
}
bool Memory::BlockCompare(Block left,Block right){
return left.first<right.first;
}
bool Memory::TaskEndEarly(Task left,Task right){
return left.timeEnd<right.timeEnd;
}
int main(){
Memory test;
test.ReadSize();
while(test.ReadTask());
test.Print();
return true;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator