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