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