题目大意:首先学习一个生物学的单词,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; }