Luogu1056排座椅

这是一道水题
本来以为和图论有关,但仔细读题发现排序+贪心就可以过掉;
话不多说上代码。

#include<bits/stdc++.h>
using namespace std;
int m,n,k,l,d;
struct node//结构体
{
int order;
int student;
}x[1010],y[1010];
inline int qread()//快读,我只是码着练一练;
{
int res = 0; bool bo = 0; char c;
while (((c = getchar()) < '0' || c > '9') && c != '-');
if (c == '-') bo = 1; else res = c - 48;
while ((c = getchar()) >= '0' && c <= '9')
res = (res << 3) + (res << 1) + (c - 48);
return bo ? ~res + 1 : res;
}
bool cmp(node a,node b)//先按照说话人数排序
{
return a.student ==b.student ? a.order <b.order : a.student >b.student ;
}
bool cmp1(node a,node b)//输出需要,要把行列按顺序输出,还要排一遍
{
return a.order <b.order ;
}
void read()
{
int x_1,y_1,p_1,q_1;

m=qread();
n=qread();
k=qread();
l=qread();
d=qread();
for(int i=1;i<=d;i++)
{
x_1=qread();
y_1=qread();
p_1=qread();
q_1=qread();
for(int i=1;i<=m;i++) x[i].order =i;
for(int i=1;i<=n;i++) y[i].order =i;
if(x_1==p_1) //两个人在同一行,记下列
{
y[min(y_1,q_1)].student ++;//要判断一下大小,记小的列
}
if(y_1==q_1)
{
x[min(x_1,p_1)].student ++;//两人同行,和列一样
}
}
}
int main()
{
//    freopen("testdata.in","r",stdin);
read();
sort(y+1,y+n+1,cmp);//先按人数排列
sort(x+1,x+1+m,cmp);
sort(x+1,x+k+1,cmp1);//后按行列顺序排不然会WA,亲身体会;
sort(y+1,y+l+1,cmp1);
for(int i=1;i<=k;i++)
{
printf("%d ",x[i].order );
}
printf("\n");
for(int i=1;i<=l;i++)
{
printf("%d ",y[i].order );
}
return 0;
}

本蒟蒻第二次发题解希望会过吧!ありがとうございます

猜你喜欢

转载自www.cnblogs.com/Shiina-Rikka/p/11223639.html