| ||||||||||
| 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:郁闷好几天了,有没好心人看下有啥毛病?跪谢。 Posted by:Jayida at 2004-10-24 12:55:54 > #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