最近小学期有道题是合并果子,这可以算是我校程序设计的神题了。渣渣开始想偷个懒不用堆排序做,后来担心会被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[n]=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;
}