讨论 / P215阅览室为什么只有80分?关键是登记的处理吗?
drcool 2013-12-24 06:43:09
点我顶贴 收藏 删除
关键是登记的处理吗? AC的同学讲讲你们的处理逻辑,尤其是怎么处理登记的

#include <stdio.h>

#include <string.h>

struct reader{

int t;

int k;

int bi[5],bt[5];

int nowk;

int freet;

int add;

};

struct reader T[100];

char book[1000];

char yu[1000][100]; //谁在预订

int yu_end[1000];

int ans;

int Get(int id)

{

int i;

for(i=0;i<yu_end[id];i++)

{

if(yu[id][i]!=-1)

{

if(T[yu[id][i]].nowk==-1) return yu[id][i];

}

}

}

int Kill( int id, int x)

{

int i;

for(i=0;i<yu_end[id];i++)

if(yu[id][i]==x)

{

yu[id][i]=-1;

break;

}

}

int main()

{

int i,j,s,tm,n;

scanf("%d %d",&tm,&n);

for(i=0;i<n;i++)

{

scanf("%d%d",&T[i].t,&T[i].k);

for(j=0;j<T[i].k;j++)

scanf("%d%d",&T[i].bi[j],&T[i].bt[j]);

T[i].nowk=-1;

}

for(i=0;i<tm;i++)

{

for(j=0;j<n;j++)

{

if(i<T[j].t) break;

if(i>=T[j].freet)

{

if(T[j].nowk!=-1)

{

book[T[j].bi[T[j].nowk]]=0;

T[j].bi[T[j].nowk]=-1;

T[j].nowk=-1;

}

}

}

for(j=0;j<n;j++)

{

if(i<T[j].t) break;

if(i>=T[j].freet)

{

if(T[j].nowk==-1)

{

for(s=0;s<T[j].k;s++)

{

if(T[j].bi[s]!=-1)

{

if(!book[T[j].bi[s]]&&((yu_end[T[j].bi[s]]==0)||(Get(T[j].bi[s])==j) ))

{

book[T[j].bi[s]]=1;

T[j].nowk=s;

ans++;

T[j].freet=i+T[j].bt[s];

Kill(T[j].bi[s],j);

break;

}

}

}

}

}

}

for(j=0;j<n;j++)

{

if(i<T[j].t) break;

if(i>=T[j].freet)

{

if((T[j].nowk==-1)&&!T[j].add)

{

for(s=0;s<T[j].k;s++)

if(T[j].bi[s]!=-1)

{

yu[T[j].bi[s]][yu_end[T[j].bi[s]]]=j;

yu_end[T[j].bi[s]]++;

}

T[j].add=1;

}

}

}

}

printf("%d",ans);

}

查看更多回复
提交回复