合并果子的三种不同做法
2014-09-11 15:24
288 查看
最近小学期有道题是合并果子,这可以算是我校程序设计的神题了。渣渣开始想偷个懒不用堆排序做,后来担心会被rejudge掉(残暴的老师总是会半夜修改测试用例,卡时间),所以又学习了一下堆排序。感觉果然快了很多啊,下面给出我的三种做法,不喜勿喷。
#include<stdio.h> #include<stdlib.h> long int a[10010],n; void heap_adjust(int i,int x) //起始点,要调整的堆得元素个数 { long int re; int j; re=a[i]; for(j=2*i;j<=x;j*=2) //设re为待调整的数,re值总是不变的,故每次交换时不需要对a[j]赋值,因为 { if(j+1<=x&&a[j+1]<a[j]) j++; if(a[j]>=re) break; a[i]=a[j]; i=j; } a[i]=re; } int main() { int i,n1; long int sum=0; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=n/2;i>=1;i--) heap_adjust(i,n); //建个堆 n1=n; while(n1>3) { if(a[2]>a[3]) { a[3]+=a[1]; sum+=a[3]; a[1]=a[n1--]; heap_adjust(3,n1); heap_adjust(1,n1); } else { a[2]+=a[1]; sum+=a[2]; a[1]=a[n1--]; heap_adjust(2,n1); heap_adjust(1,n1); } } if(n1==2) sum+=a[1]+a[2]; if(n1==3) { if(a[2]>a[3]) sum+=a[1]+a[2]+a[3]+a[1]+a[3]; else sum+=a[1]+a[2]+a[3]+a[1]+a[2]; } printf("%d\n",sum); system("pause"); return 0; }
#include<stdio.h>#include<stdlib.h>int a[10010],n,temp;long int MIN(){int i;long int min;min = 2000000000;for (i = 0; i<n; i++){if (a[i]<min){min = a[i];temp = i;}}a[temp]=2000000000;return min;}int main(){int i;long int num=0,min1,min2;scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n-1;i++){min1=MIN();min2=MIN();num=num+min1+min2;a[temp]=min1+min2;}printf("%ld\n",num);system("pause");return 0;}
#include<stdio.h>#include<stdlib.h>long int a[10010],n;void heap_adjust(int i,int x) //起始点,要调整的堆得元素个数{long int re;int j;re=a[i];for(j=2*i;j<=x;j*=2) //设re为待调整的数,re值总是不变的,故每次交换时不需要对a[j]赋值,因为{if(j+1<=x&&a[j+1]<a[j])j++;if(a[j]>=re)break;a[i]=a[j];i=j;}a[i]=re;}void insert(long int i,int n){int j;long int swap;a=i;for(j=n;j>1;j/=2){if(a[j]<a[j/2]){swap=a[j];a[j]=a[j/2];a[j/2]=swap;}}}int main(){int i,n1;long int sum=0,temp;scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&a[i]);for(i=n/2;i>=1;i--)heap_adjust(i,n); //建个堆n1=n;while(n1>1){temp=a[1];a[1]=a[n1--];heap_adjust(1,n1);temp+=a[1];a[1]=a[n1--];heap_adjust(1,n1++);insert(temp,n1);sum+=temp;}printf("%d\n",sum);system("pause");return 0;}
相关文章推荐
- 合并果子 关于排序的做法
- 减少HTTP请求来加快页面响应速度的三种做法,CSS Sprites|内联图片|合并脚本和CSS
- 石子合并 不同复杂度的做法
- [题解] 合并果子 三种方法
- 合并果子快排+上浮做法
- 合并果子优先队列做法
- sql server 合并字段值的一般做法,共三种
- 2CSS层叠规则(即引入CSS的三种不同方式的优先级)
- 合并果子
- P1097合并果子解题报告
- 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
- C# 合并多个不同格式文档为一个PDF
- Extjs中三种不同的数据提交方式
- SVN不同库之间的合并(同步)解决方案
- 三种不同类型的html标签
- 合并果子
- 三种不同语法的配置文件
- NOIP 1199 合并果子终于做出来了…
- 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
- 三种不同类型的ssh隧道