洛谷 P1056 排座椅


1.朴素算法

贪心

输入数据时进行记录,

譬如4 2 4 3

说明在 2列 和 3列 中同学说话 记录一下

2 3 3 3

说明在 2行 和 3行 中同学说话 记录一下

找出说话列最多 行最多的 按人数排位置序 输出位置

#include <iostream>
#include <algorithm>
using namespace std;

typedef long long ll;
const int MAXN = 1010;
int ah[1100] = {0}, al[1100] = {0};
int ph[1100], pl[1100];
int main()
{
	for(int i = 0; i < 1100; i++)
	{
		ph[i] = i;
		pl[i] = i;
	}
	int M, N, K, L, D;
	cin>>M>>N>>K>>L>>D;
	int tmp = D;
	while(tmp--)
	{
		int tx, ty, ta, tb;
		cin>>tx>>ty>>ta>>tb;
		if(tx == ta)
		{
			al[min(ty, tb)] ++;
		}
		else if(ty == tb)
		{
			ah[min(tx, ta)] ++;
		}
	}

	for(int i = 0; i < MAXN; i++)
	{
		for(int j = i + 1; j < MAXN; j++)
		{
			if(al[i] < al[j])
			{
				swap(al[i], al[j]);
				swap(pl[i], pl[j]);
			}
		}
	}
	
	for(int i = 0; i < MAXN; i++)
	{
		for(int j = i + 1; j < MAXN; j++)
		{
			if(ah[i] < ah[j])
			{
				swap(ah[i], ah[j]);
				swap(ph[i], ph[j]);
			}
		}
	}
	sort(ph, ph + K);
	sort(pl, pl + L);
	for(int i = 0; i < K; i++)
	{
		cout<<ph[i]<<' ';
	}	
	cout<<endl;
	for(int i = 0; i < L; i++)
	{
		cout<<pl[i]<<' ';
	}
	return 0;
}

可以用快排提升程序效率 以行列为关键字排位置

#include <iostream>
using namespace std;

const int MAXN = 1010;

int arrh[MAXN], arrl[MAXN];
int parrh[MAXN], parrl[MAXN];

void qsort(int *arr, int *brr, int fst, int lst)
{
	int i = fst, j = lst;
	int mid = arr[(i + j) / 2];
	while(i <= j)
	{
		while(arr[i] < mid)
			i++;
		while(arr[j] > mid)
			j--;
		if(i <= j)
		{
			swap(arr[i], arr[j]);
			swap(brr[i], brr[j]);
			i++;
			j--;
		}
	}
	if(i < lst)
		qsort(arr, brr, i, lst);
	if(j > fst)
		qsort(arr, brr, fst, j);
}

int main()
{
	
	for(int i = 0; i < MAXN; i++)
	{
		parrh[i] = i;
		parrl[i] = i;	
	}
	
	int n, m, h, l, t;
	cin>>n>>m>>h>>l>>t;
	int ta, tb, tc, td;
	while(t--)
	{
		cin>>ta>>tb>>tc>>td;
		if(ta == tc)
		{
			arrl[ min(tb, td) ] ++;
		}
		else if(tb == td)
		{
			arrh[ min(ta, tc) ] ++;
		}
	}
	qsort(arrl,parrl, 0, MAXN - 1);
	qsort(arrh,parrh, 0, MAXN - 1);
	qsort(parrl, arrl, MAXN - l, MAXN - 1);
	qsort(parrh, arrh, MAXN - h, MAXN - 1);
	for(int i = MAXN - h; i < MAXN ; i++)
	{
		cout<<parrh[i]<<' ';
	}
	cout<<endl;
	for(int i = MAXN - l; i < MAXN ; i++)
	{
		cout<<parrl[i]<<' ';
	}
	return 0;
}






posted @ 2018-05-23 20:53  张浦  阅读(106)  评论(0编辑  收藏  举报