这道题呢,其实主要考察了排序和对数据的处理能力。排序用快排比较合适,然后呢将数据排好序后,就可以将数据进行处理,处理各数据间的交集,用数组保存起来。然而,中间有一次错误,即结构体的当前值和前一次的相比,而未与ss和ee的值相比,导致最后结果有误。代码如下。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n=0;
int ss[5555];
int ee[5555];
struct milk{
int l;
int r;
}m[5555];
void quicksort(int left,int right){
int i, j, t, temp;
if(left >= right){
return;
}
temp = m[left].l;
i = left;
j = right;
while(i != j) {
while(m[j].l >= temp&&i<j)
j--;
while(m[i].l <= temp&&i<j)
i++;
if(i <j)
{
t=m[i].l;
m[i].l=m[j].l;
m[j].l=t;
t=m[i].r;
m[i].r=m[j].r;
m[j].r=t;
}
}
m[left].l=m[i].l;
m[i].l=temp;
temp=m[left].r;
m[left].r=m[i].r;
m[i].r=temp;
quicksort(left, i-1);
quicksort(i+1, right);
}
int main (){
freopen("milk2.in","r",stdin);
freopen("milk2.out","w",stdout);
cin>>n;
int i=0,cnt=1;
for (i=1;i<=n;i++){
cin>>m[i].l>>m[i].r;
}
quicksort(1,n);
ss[1]=m[1].l;
ee[1]=m[1].r;
for (i=2;i<=n;i++){
if (m[i].r>ee[cnt]&&m[i].l>=ss[cnt]&&m[i].l<=ee[cnt]){
ee[cnt]=m[i].r;
}
else if (m[i].l>ee[cnt]){
cnt++;
ee[cnt]=m[i].r;
ss[cnt]=m[i].l;
}
}
cout<<endl;
int work=0,rest=0;
for (i=1;i<=cnt;i++){
if (ee[i]-ss[i]>work){
work=ee[i]-ss[i];
}
if (ss[i+1]-ee[i]>rest){
rest=ss[i+1]-ee[i];
}
}
cout<<work<<" "<<rest<<endl;
}
然而,这样是用空间换时间,ss和ee数组其实只需用两个变量保存即可,用m1和m2来不断更新。以后会再写一次非数组保存的。