| ||||||||||
| 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 | |||||||||
郁闷好几天了,有没好心人看下有啥毛病?跪谢。#include<stdio.h>
#include<memory.h>
#define MaxGoods 1100000
#define MaxTrucks 1100000
#define MaxBays 1100
#define INFINITY 1000000000
int truck[MaxTrucks];//卡车装的goods种类
int cargo[MaxGoods];//货物所在heap的index
int B,G,N;//B:bay's num; G:goods's kinds; N:truck's num
int heapsize;
struct timelist
{
int time;
timelist *next;
};
timelist* head[MaxGoods];//每种货物被调用的时间队列头
timelist* tail[MaxGoods];
int p;//池申请标志
timelist pool[MaxGoods];//池
struct goods
{
int num; //编号
int time; //下次使用时间
int bay; //所在bay
}heap[MaxBays];
void rise(int index)
{//index处具有新的time值,上浮操作
int i=index;
int value=heap[index].time;
goods temp;
while(1)
{
if(i==0) break;
if(value>=heap[(i-1)/2].time)//测试发现,次处改为> 竟然错的更大了,不解.
{
cargo[heap[i].num]=(i-1)/2;
cargo[heap[(i-1)/2].num]=i;
temp=heap[i];
heap[i]=heap[(i-1)/2];
heap[(i-1)/2]=temp;
i=(i-1)/2;
}
else break;
}
}
void sink()
{//堆顶下沉
int i=0;
goods temp;
int value=heap[0].time;
while(1)
{
if(i*2+1>=heapsize) break;
if(value<heap[i*2+1].time)
{
cargo[heap[i].num]=i*2+1;
cargo[heap[i*2+1].num]=i;
temp=heap[i];
heap[i]=heap[i*2+1];
heap[i*2+1]=temp;
i=i*2+1;
continue;
}
if(i*2+2>=heapsize) break;
if(value<heap[i*2+2].time)
{
cargo[heap[i].num]=i*2+2;
cargo[heap[i*2+2].num]=i;
temp=heap[i];
heap[i]=heap[i*2+2];
heap[i*2+2]=temp;
i=i*2+2;
}
else break;
}
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
int casenum=1;
while(casenum<=T)
{
// input part
scanf("%d%d%d",&B,&G,&N);
printf("Case %d:\n",casenum++);
int i;
for(i=0;i<=G;i++)
{
cargo[i]=-1;//货物不在bay中
tail[i]=NULL;
}
p=0;
for(i=0;i<N;i++)
{
scanf("%d",&truck[i]);
pool[p].time=i;
pool[p].next=NULL;
if(tail[truck[i]]==NULL)
{
head[truck[i]]=&pool[p];
head[truck[i]]->next=NULL;
tail[truck[i]]=&pool[p++];
}
else
{
tail[truck[i]]->next=&pool[p];
tail[truck[i]]=&pool[p++];
}
}
//solve part
for(i=0;i<=G;i++) tail[i]=head[i];
heapsize=0;
int adjustvalue;//调整值
for(i=0;i<N;i++)
{
if(tail[truck[i]]->next==NULL) adjustvalue=INFINITY;
else
{
adjustvalue=(tail[truck[i]]->next)->time;
tail[truck[i]]=tail[truck[i]]->next;
}
if(cargo[truck[i]]!=-1)
{//货物已经在bay中
heap[cargo[truck[i]]].time=adjustvalue;
rise(cargo[truck[i]]);
printf("NO ACTION\n");
continue;
}
if(heapsize<B)
{//bay还未占满,在堆中添加结点
heap[heapsize].num=truck[i];
heap[heapsize].bay=heapsize;
heap[heapsize].time=adjustvalue;
cargo[truck[i]]=heapsize++;
rise(heapsize-1);
printf("LOAD %d %d\n",heapsize,truck[i]);
continue;
}
//需要置换 调整堆顶
cargo[heap[0].num]=-1;
heap[0].num=truck[i];
heap[0].time=adjustvalue;
cargo[truck[i]]=0;
printf("LOAD %d %d\n",heap[0].bay+1,truck[i]);
sink();
}
printf("\n");
}
return 1;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator