简单题,贪心过。 先按每个exno的终点对输入进行排序,然后选最近的exno whose开始大于上一个选定exno结尾,边选边输出序号,完毕。 忍不住做道题,2008年AC的第一道题,一次就AC了,开心。 //2008-01-01 03:01:15 Accepted 1076 C++ 00:00.00 440K #include<stdio.h> int n; struct exno { int s;//start int e;//end int no; }; exno s[1001]; int partiton(exno a[1001],int p, int r) { int x = a[r].e; int i = p-1; int j; exno t; for(j=p;j<=r-1;j++) { if(a[j].e<=x) { i++; t=a[j];a[j]=a[i];a[i]=t; } } t=a[r];a[r]=a[i+1];a[i+1]=t; return i+1; } //以每一段的终点来排序,即以s[i].e从小到大排序。 void quicksort(exno a[1001],int p,int r) { int q; if(p<r) { q = partiton(a,p,r); quicksort(a,p,q-1); quicksort(a,q+1,r); } } int main() { int i,j,key,t; freopen("1076.txt","r",stdin); while((scanf("%d",&n)!=EOF) && n>0) { for(i=1;i<=n;i++) { scanf("%d %d",&s[i].s,&s[i].e); s[i].no = i; } quicksort(s,1,n); key = s[1].e; printf("%d",s[1].no); for(i=2;i<=n;i++) { if(s[i].s>key) { printf(" %d",s[i].no); key = s[i].e; } } printf("/n"); } fclose(stdin); return 0; }