讨论 / 双队列+快排,为什么只有30分?
jiangfuyu 2011-01-30 18:26:00
点我顶贴 收藏 删除
#include <iostream>

using namespace std;

unsigned int n, a[1001], b[1001], v = 0;

int qs(int l, int r) {

long long i = l, j = r, mid = a[(l + r) / 2];

do {

while (a[i] < mid) i++;

while (a[j] > mid) j--;

if (i <= j) {

swap(a[i], a[j]);

i++, j--;

}

} while (i <= j);

if (i < r) qs(i, r);

if (l < j) qs(l, j);

}

int main() {

cin >> n;

for (int i = 1; i <= n; i++) {

scanf("%d", &a[i]);

}

qs(1, n);

b[1] = a[1] + a[2];

v += b[1];

int i = 3, j = 1, k = 1;

for (int c = 1; c <= n - 2; c++) {

unsigned int _min = 1<<31, p = 0;

if ((a[i] + a[i + 1]) < _min && (i + 1) <= n) {_min = (a[i] + a[i + 1]); p = 1;}

if ((a[i] + b[j]) < _min && i <= n && j <= k) {_min = (a[i] + b[j]); p = 2;}

if ((b[j] + b[j + 1]) < _min && (j + 1) <= k) {_min = (b[j] + b[j + 1]); p = 3;}

b[++k] = _min;

v += _min;

if (p == 1) {

i += 2;

} else if (p == 2) {

i++;

j++;

} else if (p == 3) {

j += 2;

}

}

cout << v << endl;

return 0;

}

请大牛们帮忙看看

查看更多回复
提交回复