您的位置:首页 > 其它

poj 3633 Costume Party

2012-09-04 00:08 369 查看
题目大意:就是给一组数,求有多少对数的和不超过给定值

解题思路:水题。。。。。用来练练自己手写快速排序的。。。。

先把数按从小到大排列,然后用两个序号low,high分别指向第0个数和第n-1个数

当array[low] + array[high] <= s时

low和high之间的数都能和low位置的数组成对

然后low++

当array[low] + array[high] > s时

high--

想手写个快排,但是一直wa,,,,

#include <iostream>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;

const int maxn = 20010;

int n,s, array[maxn];

void quickSort(int *array, int low, int high);

inline int random(int begin, int end);
inline void swap(int &a, int &b);

int main()
{
	
	int low, high, ans;
//	srand(time(0)); 
	while(scanf("%d %d", &n, &s) != EOF)
	{
		ans = 0;
		for(int i = 0; i < n; i++)
			scanf("%d", &array[i]);
		sort(array, array + n);
//		quickSort(array, 0, n - 1);
		low = 0, high = n - 1;
		while(low < high)
		{
			if(array[low] + array[high] <= s)
			{
				ans += high - low;
				low++;
			}
			else
				high--;
		}
		printf("%d\n", ans);
	}
	
	return 0;
}

inline int random(int begin, int end)
{
	return begin + rand() % (end - begin + 1);
}

inline void swap(int &a, int &b)
{
	a ^= b;
	b ^= a;
	a ^= b;
}

void quickSort(int *array, int low, int high)
{
	if(low < high)
	{
		/*
		int t = random(low + 1, high);
		swap(array[low], array[t]);*/
		int tmp = array[low];
		int i = low;
		for(int j = low + 1; j <= high; j++)
		{
			if(array[j] <= tmp)
			{
				i++;
				if(i != j)
					swap(array[i], array[j]);
			}
		}
		swap(array[i], array[low]);
		quickSort(array, low, i - 1);
		quickSort(array, i + 1, high);
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: