用arr1[i],arr2[i]分別保存第i個農民的工做開始,結束時間,爲方便後面的計算,應該把每一個農民工做開始時間按升序排列。能夠在輸入每一個農民工做起止時間的時候使用插入排序的方法給其排序。排序好之後,以第一個農民的起始工做時間爲start,工做結束時間爲end,和下一個農民的工做時間比較,在時間斷開的時候,計算出連續的有人工做時間和無人工做時間,而後重置start和end;時間未斷開則繼續和下一個農民的工做時間比較。輸出的是連續的有人工做時間和無人工做時間的最大值。spa
/* ID: whutzha1 PROG: milk2 LANG: C++ */ #include<fstream> using namespace std; ifstream cin("milk2.in"); ofstream cout("milk2.out"); int main() { int arr1[5000]; int arr2[5000]; int n,i,a,b,j,k; cin>>n; cin>>arr1[0]>>arr2[0]; for (i=1;i<n;i++) { cin>>a>>b; for(j=i-1;j>=0;j--) { if(a<arr1[j]) {;} else { for(k=i-1;k>j;k--) { arr1[k+1]=arr1[k];arr2[k+1]=arr2[k];} arr1[j+1]=a; arr2[j+1]=b; break; } } if (j==-1) { for(k=i-1;k>j;k--) { arr1[k+1]=arr1[k];arr2[k+1]=arr2[k];} arr1[j+1]=a; arr2[j+1]=b; } } int start,end,time1=0,time2=0,max1=0,max2=0; start=arr1[0];end=arr2[0]; for (i=1;i<n;i++) { if (arr1[i]<=end) { if (arr2[i]<end) {;} else { end=arr2[i];} } else { time1=end-start; if (time1>max1) max1=time1; time2=arr1[i]-end; if (time2>max2) max2=time2; start=arr1[i];end=arr2[i]; } } time1=end-start; if (time1>max1) max1=time1; cout<<max1<<" "<<max2<<endl; return 0; }