当前位置:编程学习 > C/C++ >>

10148 - Advertisement

[cpp] 
描述:区间选点问题,刘汝佳书上有这题,自己看看就会了 
#include <cstdio>  
#include <cstring>  
#include <cstdlib>  
int s[1010][2]; 
bool str[20010]; 
int cmp(const void *p1,const void *p2) 

    if(((int *)p1)[1] > ((int *)p2)[1]) return 1; 
    else if(((int *)p1)[1] < ((int *)p2)[1]) return -1; 
    else 
    { 
        if(((int *)p1)[0] > ((int *)p2)[0]) return -1; 
        else return 1; 
    } 

int main() 

    //freopen("a.txt","r",stdin);  
    int t,n,m,x,y,min,max,p; 
    scanf("%d",&t); 
    while(t--) 
    { 
        min=20000,max=p=0; 
        memset(str,false,sizeof(str)); 
        scanf("%d %d",&n,&m); 
        for(int i=0; i<m; i++) 
        { 
            scanf("%d %d",&x,&y); 
            if(x>y) 
            { 
                int t=x; 
                x=y; 
                y=t; 
            } 
            x+=10000; 
            y+=10000; 
            s[i][0]=x; 
            s[i][1]=y; 
            if(y>max) max=y; 
            if(x<min) min=x; 
        } 
        qsort(s,m,sizeof(s[0]),cmp); 
        for(int i=0; i<m; i++) 
        { 
            x=s[i][0]; 
            y=s[i][1]; 
            int count=0; 
            for(int j=x; j<=y; j++) if(str[j]) count++; 
            for(int j=y; j>=x&&count<n; j--) 
                if(!str[j]) 
                { 
                    str[j]=true; 
                    p++; 
                    count++; 
                } 
        } 
        printf("%d\n",p); 
        for(int i=min; i<=max; i++) 
            if(str[i]) printf("%d\n",i-10000); 
        if(t) printf("\n"); 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,