合并果子的三种不同做法

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




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值