zoj1076 Gene Assembly

时间:2021-12-10 07:01:33

这道和zoj1025一样,本质是贪心算法,首先要求任意最长的序列,我们只要保证最长就行,也就是在一幅图中找一个最长的链,首先我们需要根据y排序(输入为x,y),因为y大的肯定在y小的后面,然后就直接贪心,前面取不到后面就不可能取到那个数,证明了贪心的正确性。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<iostream>
#include<cstring>
using namespace std;
int n;
struct node
{
int x,y,r;
}a[1005]; bool cmp(node a,node b)
{
if(a.y<b.y)
return 1;
return 0;
}
int ans[1006];
int res;
void dp(int xx)
{
ans[res++]=a[xx].r;
for(int i=xx+1;i<n;i++)
{
if(a[i].x>a[xx].y)
{
dp(i);
break;
}
}
}
int main()
{
// freopen("input.txt","r",stdin);
while(scanf("%d",&n)==1&&n)
{
res=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
a[i].r=i+1;
}
sort(a,a+n,cmp);
// for(int i=0;i<n;i++)
// {
// printf("%d %d\n",a[i].x,a[i].y);
// }
dp(0);
// printf("%d\n",res);
for(int i=0;i<res-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[res-1]);
}
}