原题链接

题目大意:首先学习一个生物学的单词,exon:外显子,DNA序列中能够翻译表达的片段。给出很多外显子的起始点和终点,求寻找包含最多外显子的一条链,并且输出这些外显子的编号。

解法:先把所有外显子按照起始点的先后排序,相同起始位置的则看终止位置。然后就是一个一个查找,如果当前外显子的终点在下一个外显子之后,就跳过当前的;否则就输出当前外显子的编号。这里使用了vector来存储外显子。写了一段判断大小的代码,作为sort()函数的判断条件,有必要做个标记。

参考代码:

#include<iostream>
#include <algorithm>
#include <vector>
#include<string.h>
using namespace std; struct Exon{
int st,ed,index;
}t; int lessthan(Exon a, Exon b){ //this function is necessary. Elements are compared based on this function.
if(a.st<b.st) return 1; //First sort by the start point of each exon.
else if(a.st==b.st&&a.ed<b.ed) return 1; //If start is equal, then sort by the end.
else return 0;
} int main(){
int i,n;
vector<Exon> exon;
while(cin>>n&&n){
int flag[1000]={0},j=0;
memset(flag,0,sizeof(flag));
while(!exon.empty()) exon.pop_back(); //remember to empty the vector!!!
for(i=0;i<n;i++){
cin>>t.st>>t.ed;
t.index=i+1;
exon.push_back(t);
}
sort(exon.begin(),exon.end(),lessthan);
int tail=-1;
for(i=0;i<n-1;i++){
if(exon[i].st>=tail&&exon[i].ed<exon[i+1].ed){
flag[j++]=exon[i].index;
tail=exon[i].ed;
}
else continue;
}
if(exon[n-1].st>=tail)flag[j]=exon[n-1].index;
cout<<flag[0];
for(i=1;i<=j;i++)
cout<<' '<<flag[i];
cout<<endl;
} return 0;
}
05-11 09:39