地址:http://hustoj.sinaapp.com/problem.php?id=1820
按开始时间排序,然后统计最长挤牛奶时间段和最长间隔段。快排又写错了一次......
1 #include<stdio.h> 2 3 int a[5000][2],n; 4 5 int ones(int l,int r) 6 { 7 int i=l,j=r,flag=0,key=a[l][0]; 8 int t1,t2; 9 while(i<j) 10 { 11 if(0==flag) 12 { 13 if(a[j][0]<key) 14 { 15 t1=a[j][0]; 16 t2=a[j][1]; 17 a[j][0]=a[i][0]; 18 a[j][1]=a[i][1]; 19 a[i][0]=t1; 20 a[i][1]=t2; 21 flag=1; 22 } 23 else 24 { 25 j--; 26 } 27 } 28 else 29 { 30 if(a[i][0]>key) 31 { 32 t1=a[j][0]; 33 t2=a[j][1]; 34 a[j][0]=a[i][0]; 35 a[j][1]=a[i][1]; 36 a[i][0]=t1; 37 a[i][1]=t2; 38 flag=0; 39 } 40 else 41 { 42 i++; 43 } 44 } 45 } 46 return i; 47 } 48 49 void quick(int l,int r) 50 { 51 int mid; 52 if(l<r) 53 { 54 mid=ones(l,r); 55 quick(l,mid-1); 56 quick(mid+1,r); 57 } 58 } 59 60 int main() 61 { 62 int i,max1=0,max2=0,t1=0,t2=0,t[2]; 63 scanf("%d",&n); 64 for(i=0;i<n;i++) 65 { 66 scanf("%d %d",&a[i][0],&a[i][1]); 67 } 68 quick(0,n-1); 69 t[0]=a[0][0]; 70 t[1]=a[0][1]; 71 max1=t1=t[1]-t[0]; 72 for(i=1;i<n;i++) 73 { 74 if(a[i][0]<=t[1]) 75 { 76 if(a[i][1]>t[1]) 77 { 78 t1=t1+a[i][1]-t[1]; 79 t[1]=a[i][1]; 80 } 81 } 82 else 83 { 84 t1=a[i][1]-a[i][0]; 85 t2=a[i][0]-t[1]; 86 t[0]=a[i][0]; 87 t[1]=a[i][1]; 88 } 89 max1=t1>max1?t1:max1; 90 max2=t2>max2?t2:max2; 91 } 92 printf("%d %d\n",max1,max2); 93 return 0; 94 }