排序?重叠数?傻傻分不清楚

来源:互联网 发布:阿里云服务器ip段 编辑:程序博客网 时间:2024/05/02 22:26

点击打开链接

这题乍看上去就觉得是要根据begin的时间来降序排列好,然后比较end[i]和begin[i+1]的大小,如果begin大于或者等于end,则说明有重合,天数加1,否则天数不变,贴上代码:


#include<iostream>
#include<algorithm>
using namespace std;
struct ss
{
int start,end;
}pp[105];
int cmp(ss a,ss b)
{
return a.start<b.start;
}
int main()
{
int n,i,sum;
while(cin>>n&&n)
{
sum=1;
for(i=0;i<n;i++)
cin>>pp[i].start>>pp[i].end;
sort(pp,pp+n,cmp);
for(i=0;i<n-1;i++)
{
if(pp[i].end>=pp[i+1].start)
sum++;
}
cout<<sum<<endl;
}
return 0;
}


但是wa了惊恐,后来请教了下队友,知道错在哪了,首先排序就没考虑全,其次,在算天数的时候比较的都是相邻的两个时间,得不到全局最优解的,然后要改动需要大动工快哭了。在此借用下下队友的代码,来解释下下用排序的话要肿么做:

#include<iostream>
#include<algorithm>
using namespace std;
struct Fun
{
int a;//开始时间
int b;//结束时间
}fun[1000];
int cmp(Fun a,Fun b)
{
if(a.b<b.b)
return 1;
else
{
if(a.b==b.b)
{
if(a.a<b.a)
return 1;
else
return 0;
}
else
return 0;
}
}
int main()
{
int k,t,p[24],d,n,max,day[100];
int i,j;
while(~scanf("%d",&n))
{
if(n==0)
break;
memset(p,0,sizeof(p));
for(i=0;i<n;i++)
scanf("%d%d",&fun[i].a,&fun[i].b);
sort(fun,fun+n,cmp);
d=0;
memset(day,-1,sizeof(day));
for(i=0;i<n;i++)
{
for(j=1;j<=n;j++)
{
if(p[i]==0 && day[j]<fun[i].a)
{
day[j]=fun[i].b;
p[i]=1;
if(d<j)
d=j;
}
}
}
printf("%d\n",d);
}
return 0;
}

果断换做法奋斗,用求最大重叠数来求最小天数,就是当时间有重合时,重叠数加1,直到数据结束后,取其最大的重合数就是最小天数了,,,,贴出AC的代码,,

#include<iostream>
using namespace std;
int main()
{
int c[201],a[201],b[201],i,j,n,k,sum;
while(cin>>n,n)
{
for(i=0;i<=200;i++)
c[i]=0;
sum=0;
for(i=1;i<=n;i++)
{
cin>>a[i]>>b[i];
if(a[i]>b[i])
{
k=a[i];
a[i]=b[i];
b[i]=k;
}
for(j=a[i];j<=b[i];j++)
{
c[j]++;
if(c[j]>sum)
sum=c[j];
}
}
cout<<sum<<endl;
}
return 0;
}