这道题我刚开始是想先把所有的搬桌子的任务按照起点进行排序,然后再算出时间,可是一直没有思路。
上网找了找,发现了一个很巧妙的方法,其实就是换种思路来思考问题。应走道两边各有200个房间,把走道等分为200个节点,每个节点有桌子经过时,节点经过次数加一,求完成任务的时间实际上就是求经过的过道节点次数最多的地方。代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 int main(void) 4 { 5 int t,n,u,d,i,j,move[201]; 6 scanf("%d",&t); 7 while(t>0) 8 { 9 scanf("%d",&n); 10 if(n>200||n<=0) 11 break; 12 memset(move,0,sizeof(move)); 13 for(j=0;j<n;j++) 14 { 15 scanf("%d%d",&u,&d); 16 u=(u-1)/2; 17 d=(d-1)/2; 18 if(u>d) 19 { 20 i=u;u=d;d=i; 21 } 22 for(i=u;i<=d;i++) 23 move[i]++; 24 } 25 i=move[0]; 26 for(j=0;j<200;j++) 27 if(move[j]>i) 28 i=move[j]; 29 printf("%d\n",i*10); 30 t--; 31 } 32 return 0; 33 }