这是一道水题
本来以为和图论有关,但仔细读题发现排序+贪心就可以过掉;
话不多说上代码。
#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(" "); for(int i=1;i<=l;i++) { printf("%d ",y[i].order ); } return 0; }
本蒟蒻第二次发题解希望会过吧!ありがとうございます