[2008年NOIP普及组] 排座椅
算法分析:如果有两个会说话,那么就要在他们之间找一个不同的行或列的值较小的,因为数据较小用桶排,用贪心找出在尽可能覆盖多的情况,存入另一个数组,用比较排序按从小到大输出
注意:最后输出的是有顺序的,需要再次比较
#include<bits/stdc++.h>
using namespace std;
int m,n,k,d,l,a,b,c,e,maxs,bj;
int i,j,ii,mm[33000],ll[23000],ms[33000],ls[33000];
int main(){
cin>>m>>n>>k>>l>>d;
for(j=1;j<=d;j++){
cin>>a>>b>>c>>e;
if(a==c){
if(b>e){
ll[e]++;
}
else{
ll[b]++;
}
}
else{
if(a>c){
mm[c]++;
}
else{
mm[a]++;
}
}
}
for(j=1;j<=k;j++){
maxs=-1;
bj=0;
for(i=1;i<=m;i++){
if(maxs<=mm[i]){
maxs=mm[i];
bj=i;
}
}
mm[bj]=0;
ms[j]=bj;
}
for(j=1;j<=k;j++){
for(i=j+1;i<=k;i++){
if(ms[j]>ms[i]){
int t=ms[j];
ms[j]=ms[i];
ms[i]=t;
}
}
cout<<ms[j]<<" ";
}
cout<<endl;
for(j=1;j<=l;j++){
maxs=-1;
bj=0;
for(i=1;i<=n;i++){
if(maxs<=ll[i]){
maxs=ll[i];
bj=i;
}
}
ll[bj]=0;
ls[j]=bj;
}
for(j=1;j<=l;j++){
for(i=j+1;i<=l;i++){
if(ls[j]>ls[i]){
int t=ls[j];
ls[j]=ls[i];
ls[i]=t;
}
}
cout<<ls[j]<<" ";
}
}
浙公网安备 33010602011771号