题意:在一个长走廊里搬桌子,走廊的两侧都是房间,把桌子从一个房间搬到另外一个房间,走廊的宽度只能允许一个桌子通过,每次搬桌子需要10分钟(每一次允许再不交叉的走廊中同时搬桌子),问最少多长时间搬完!
思路:因为每次搬的时间是一定的,所以可以看作是至少要搬多少次。而决定它最少搬多少次的因素就是有多少次搬桌子的过程中是存在线路的交叉的!所以可以把每一两个相对的房间之间的走廊所通过的次数记录下来(房间1和2之间的走廊用room[1]),找出所有部分通过最多的一个部分,它的通过次数就是在搬运过程中最大的交叉次数,也就是所需要的最少的搬运次数!

1 #include<stdio.h> 2 #include<string.h> 3 int a[202]; 4 int b[202]; 5 int room[202];//用于记录走廊的通过次数。 6 int main() 7 { 8 int t,n,i,j,min,max,least,w; 9 scanf("%d",&t); 10 while(t--) 11 { 12 min=410;max=0;least=0; 13 memset(room,0,sizeof(room)); 14 scanf("%d",&n); 15 for(i=0;i<n;i++) 16 { 17 scanf("%d%d",&a[i],&b[i]); 18 if(a[i]>b[i]) 19 { 20 w=a[i]; 21 a[i]=b[i]; 22 b[i]=w; 23 } 24 //对a[i]和b[i]之间的room都进行加1操作 25 for(j=(a[i]+1)/2;j<=(b[i]+1)/2;j++) 26 { 27 room[j]++; 28 } 29 } 30 //找出room中最大的数#include<stdio.h> 31 #include<string.h> 32 int a[202]; 33 int b[202]; 34 int room[202]; 35 int main() 36 { 37 int t,n,i,j,min,max,least,w; 38 scanf("%d",&t); 39 while(t--) 40 { 41 min=410;max=0;least=0; 42 memset(room,0,sizeof(room)); 43 scanf("%d",&n); 44 for(i=0;i<n;i++) 45 { 46 scanf("%d%d",&a[i],&b[i]); 47 if(a[i]>b[i]) 48 { 49 w=a[i]; 50 a[i]=b[i]; 51 b[i]=w; 52 } 53 for(j=(a[i]+1)/2;j<=(b[i]+1)/2;j++) 54 { 55 room[j]++; 56 } 57 } 58 for(i=1;i<=200;i++) 59 { 60 if(room[i]>least) 61 least=room[i]; 62 } 63 printf("%d\n",least*10); 64 } 65 return 0; 66 } 67 for(i=1;i<=200;i++) 68 { 69 if(room[i]>least) 70 least=room[i]; 71 } 72 printf("%d\n",least*10); 73 } 74 return 0; 75 }