Luogu1056&&NOIP2008 排座椅

先来个传送门

题意:给定m行n列的教室,中间有d对同学会交头接耳,要求选出k行l列使得交头接耳的同学最少。

显然这是个贪心题,每一行每一列能隔多少隔多少,隔的对数越多越好。因此我们只需要将每对同学所在行和所在列标记,分别对行列排序,输出前k行和前l列就行。

当然这只有50pts。

再看看题目:要求ai​<ai​+1

嗯还要升序输出

大概这就是本题最坑的点了(蒟蒻的我被坑了4

下面是代码

 

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b)
{
	return a.first>b.first;
}
bool cmp1(pair<int,int> a,pair<int,int> b)
{
	return a.second<b.second;
}
pair<int,int> book1[100001],book2[100001];
int main()
{
	int m,n,k,l,d;
	scanf("%d%d%d%d%d",&m,&n,&k,&l,&d);
	while(d--)
	{
		int x,y,p,q;
		scanf("%d%d%d%d",&x,&y,&p,&q);
		if(abs(x-p)==1&&y==q)book1[min(x,p)].first++;
		if(abs(y-q)==1&&x==p)book2[min(y,q)].first++;
	}
	for(int i=1;i<=m;i++)book1[i].second=i;
	for(int i=1;i<=n;i++)book2[i].second=i;
	sort(book1+1,book1+1+m,cmp);
	sort(book2+1,book2+1+n,cmp);
	sort(book1+1,book1+1+k,cmp1);
	sort(book2+1,book2+1+l,cmp1);
	for(int i=1;i<=k;i++)cout<<book1[i].second<<" ";
	cout<<endl;
	for(int i=1;i<=l;i++)cout<<book2[i].second<<" ";
	return 0;
}

 

  

 

 

posted @ 2018-10-03 23:28  _Gingoo  阅读(379)  评论(0)    收藏  举报