您的位置首页百科知识

合并果子

合并果子

他的意思是说, 只能过第一组和第十组数据合并果子, 以前的省赛题算法就是贪心, 每次取数据中最小的两个,合并后再插入因为每次合并都有插入操作,所以插入排序是不够好的这样的效察带逗率是 O(n^2)普遍做法是使用 堆结构 来维护这组数据堆是一种比较简单的数据结构可以尝试实现再不然,你可以用stl中的 priority_queue#include 就可以了它就是堆结构的一个实现 我大概看了你的程序,没有发现什么问题不甘心, 我自己试了一下确实只能过两个数据我又稍微修改了一些,编译通过...├ 测试数据 01:答案正确... 212ms├ 测试数据 02:答案正确... 0ms├ 测试数据 03:答案正确... 0ms├ 测试数据 04:答案正确... 0ms├ 测试数据 05:答案正确... 0ms├ 测试数据 06:答案正确... 0ms├ 测试数据 07:答案正确... 119ms├ 测试数据 08:答案正确... 228ms├ 测试数据 09:答案正确... 134ms├ 测试数据 10:答案正确... 228ms #include #include int a[10005];int cmp(const void* a,const void* b){ return *(int*)a-*(int*)b;}int main() { int n, i, j; int t = 0, x; scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &a[i]); qsort(a,n,sizeof(a[0]),cmp); for (i = 1; i < n; i++) { a[i] += a[i - 1]; t += a[i]; for (j = i; j < n-1 && a[j] > a[j + 1]; j++) { x = a[j]; a[j] = a[j + 1]; a[j + 1] = x; } } printf("%d", t); return 0;}上面是原程序,只是更改了快排看来是你快排有问题 你那快排确实不大优美, 也许有些小毛病void qs(int *s,int l,int r){ if(r<=l)return; int i=l,j=r,t=s[i]; while(i#includeusing namespace std;priority_queue q;int main(){ int n,x; scanf("%d",&n); for (;n--;q.push(x)) scanf("%d",&x); for(x=0;!q.empty();q.push(n)){ n=q.top(); q.pop(); if(q.empty())break; n+=q.top(); q.pop(); x+=n; } printf("%d",x); return 0;}我以前参加过noip, 所以有兴趣tazerkinq@163.com