| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
刚串完门回来~用堆排序完全没有问题~我试过了,sort和堆都可以~(附代码)In Reply To:求解释:为什么用堆排序会wa?难道有特殊数据? Posted by:gaozhenyangzhou at 2011-02-02 22:49:50 堆方法的实现如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 20010;
int n, s, len[N];
void heap(int x, int y)
{
int i, j, tmp = len[x];
i = x;
j = i << 1;
while(j <= y)
{
if(j<y && len[j]<len[j+1]) j++;
if(len[j] > tmp)
{
len[i] = len[j];
i = j;
j = i << 1;
}
else break;
}
len[i] = tmp;
}
int deal(int l, int r, int tmp)
{
int req = -1, mid, pre = l-1;
if(l > r) return 0;
while(l <= r)
{
mid = (l+r) >> 1;
if(len[mid] <= tmp)
{
req = mid;
l = mid + 1;
}
else r = mid - 1;
}
if(req == -1) return 0;
else return req-pre;
}
int main()
{
int i, ls, ans = 0;
scanf("%d%d", &n, &s);
for(i = 1; i <= n; i++) scanf("%d", &len[i]);
for(i = n/2; i > 0; i--) heap(i, n);
ls = n;
for(i = 1; i < n; i++)
{
swap(len[1], len[ls--]);
heap(1, ls);
}
for(i = 1; i <= n; i++)
ans += deal(i+1, n, s-len[i]);
printf("%d\n", ans);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator