NOIP2008 普及组 复赛 seat 排座椅

本文提供NOIP2008普及组复赛排座椅问题的详细解析及AC代码,采用结构体与排序算法实现对学生讲话区域的划分,确保输出符合题目要求的顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值