您的位置:首页 > 其它

合并果子的三种不同做法

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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: