NOIP2008 普及组 复赛 seat 排座椅

来源:互联网 发布:漫画软件那个好 编辑:程序博客网 时间:2024/04/27 23:40

 NOIP2008 普及组 复赛 seat 排座椅

//洛谷 p1056 排座椅
//难度:普及/提高-
//考点:输入,输出 ,结构体,排序  
//适用:小学生
//陷阱:该题输出有顺序要求ai< ai+1 bi< bi+1,考试中读题还是需花些时间
//思路:对讲话学生进行行列分割统计,对分割线进行由大到小的排序,安排分割线。

附上AC代码,编译环境Dev-C++4.9.9.2

#include <stdio.h>
#include <string.h>
struct node{
    int pos;
    int count;
}row[1000+10],col[1000+10],t;
int ans_row[1000+10],ans_col[1000+10],ans_t;
int main(){
    int m,n,k,l,d;
    int i,j;
    int a1,b1,a2,b2;
    memset(row,0,sizeof(row));
    memset(col,0,sizeof(col));
    scanf("%d%d%d%d%d",&m,&n,&k,&l,&d);
    for(i=1;i<=d;i++){
        scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
        if(b1==b2)//列相同
            if(a1>a2){
                row[a2].pos=a2;
                row[a2].count++;
            }else{
                row[a1].pos=a1;
                row[a1].count++;
            }
        if(a1==a2)//行相同
            if(b1>b2){
                col[b2].pos=b2;
                col[b2].count++;
            }else{
                col[b1].pos=b1;
                col[b1].count++;//笔误,此处写成col[b2].count++查了好半天
            }
    }
    //排序,自大到小
    for(i=1;i<=m;i++)
        for(j=i+1;j<=m;j++)
            if(row[i].count<row[j].count){
                t=row[i];
                row[i]=row[j];
                row[j]=t;
            }
    for(i=1;i<=n;i++)
        for(j=i+1;j<=n;j++)
            if(col[i].count<col[j].count){
                t=col[i];
                col[i]=col[j];
                col[j]=t;
            }
    for(i=1;i<=k;i++)
        ans_row[i]=row[i].pos;
    for(i=1;i<=k;i++)
        for(j=i+1;j<=k;j++)
            if(ans_row[i]>ans_row[j]){//自小到大排序
                ans_t=ans_row[i];
                ans_row[i]=ans_row[j];
                ans_row[j]=ans_t;
            }
    for(i=1;i<=l;i++)
        ans_col[i]=col[i].pos;
    for(i=1;i<=l;i++)
        for(j=i+1;j<=l;j++)
            if(ans_col[i]>ans_col[j]){//自小到大排序
                ans_t=ans_col[i];
                ans_col[i]=ans_col[j];
                ans_col[j]=ans_t;
            }
    if(k>0){
        printf("%d",ans_row[1]);
        for(i=2;i<=k;i++)
            printf(" %d",ans_row[i]);
        printf("\n");
    }
    if(l>0){
        printf("%d",ans_col[1]);
        for(i=2;i<=l;i++)
            printf(" %d",ans_col[i]);
        printf("\n");
    }
    return 0;
}


0 0