题目大意:就是给一组数,求有多少对数的和不超过给定值
解题思路:水题。。。。。用来练练自己手写快速排序的。。。。
先把数按从小到大排列,然后用两个序号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);
}
}