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

浙公网安备 33010602011771号