程序员测试题:PAT 乙级 1015 德才论5(使用动态开辟数组) (C语言版本)

程序员测试题:PAT 乙级 1015 德才论5(使用动态开辟数组) (C语言版本)

思路:
将全局变量二维数组变成二维数组动态开辟,测试显示内存使用很大,运行超时。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h> 

void pri(int** arrin,int ruwei)
{
	int p,i;
	for(p=0;p<ruwei;p++)
	{
		
		for(i=0;i<3;i++)
		{
			printf("%d",arrin[p][i]);
			if(i<2)
			printf(" ");
			
		}
		printf("\n");		
	}	
}

/*去掉输出outarr数组,去掉一个函数接口*/
void sort(int** inarr,int ruwei)
{
//	int outarr[100000][3]={0}; 
	int ii=0,jj=0,max=0,sum=0;
	int i,temp=0;
	int choicearr[3]={0};//临时存储最大数据	
	//选择排序法 
	for(ii=0;ii<ruwei;ii++)
	{
		
		for(i=ii;i<ruwei;i++)//求数组中的最大值
		{
			sum = inarr[i][1]+inarr[i][2];
			if(sum>max) 
			{
				max=sum;			 
				temp=i; //记录最后的i值,此时outarr最大。 
			}							
		}
			memcpy(choicearr,inarr[ii],3*sizeof(int));
			memcpy(inarr[ii],inarr[temp],3*sizeof(int));//头部放入最大值 
			memcpy(inarr[temp],choicearr,3*sizeof(int));					 
			max=0; //max清零,重新进入循环取最大值 
		
	}
	//重复的根据德分排序
	int iii=0,jjj=0;
	int temparr[3]={0};
	
	for(iii=0;iii<ruwei-1;iii++)//根据德才的分数冒泡排序,队伍末尾的元素不需要算进去总共循环ruwei-1+ruwei-1-1+ruwei-1-2+…… 
	{
		for(jjj=0;jjj<ruwei-1-iii;jjj++)
		{	
			if((inarr[jjj][1]+inarr[jjj][2])==(inarr[jjj+1][1]+inarr[jjj+1][2]))
			{
				if(inarr[jjj][1]<inarr[jjj+1][1])
				{
					memcpy(temparr,inarr[jjj],3*sizeof(int));
					memcpy(inarr[jjj],inarr[jjj+1],3*sizeof(int));
					memcpy(inarr[jjj+1],temparr,3*sizeof(int));
				}			
						
			} 
		}		
	}
	int iiii,jjjj;
	for(iiii=0;iiii<ruwei-1;iiii++)//据考号冒泡排序,
	{
		for(jjjj=0;jjjj-ruwei-1-iiii;jjjj++)
		{
			if((inarr[jjjj][1]+inarr[jjjj][2])==(inarr[jjjj+1][1]+inarr[jjjj+1][2])&&(inarr[jjjj][1]==inarr[jjjj+1][1]))
			{
				if(inarr[jjjj][0]>inarr[jjjj+1][0])
				{
					memcpy(temparr,inarr[jjjj],3*sizeof(int));
					memcpy(inarr[jjjj],inarr[jjjj+1],3*sizeof(int));
					memcpy(inarr[jjjj+1],temparr,3*sizeof(int));	
				}
			}
		}
	}
	
	
	pri(inarr,ruwei);//打印 
		 	
}





//	int arr[100000][3] = {0};
//	int arr1[100000][3] = {0};
//	int arr2[100000][3] = {0};
//	int arr3[100000][3] = {0};
//	int arr4[100000][3] = {0};



int main(){

	int n,l,h;
	scanf("%d %d %d",&n,&l,&h);
	int i=0,j=0;
	int ruwei=0;
	int ruwei1=0;
	int ruwei2=0;
	int ruwei3=0;
	int ruwei4=0;	
	int out,in=0;
	

	//开辟二维数组
	int **arr =(int**)calloc(n,sizeof(int*));
	for(out=0;out<n;out++)
	{

        arr[out] = (int*)calloc(3,sizeof(int));

	}	

	int ii,jj;	
	for(ii=0;ii<n;ii++)
	{
		for(jj=0;jj<3;jj++)
		{
			scanf("%d",&arr[ii][jj]);				
		}
	
	}


	//开辟二维数组 
	int **arr1 =(int**)calloc(n,sizeof(int*));
	for(out=0;out<n;out++)
	{
		arr1[out] = (int*)calloc(3,sizeof(int));
	}
	
	int **arr2 =(int**)calloc(n,sizeof(int*));
	for(out=0;out<n;out++)
	{
		arr2[out] = (int*)calloc(3,sizeof(int));
	}
	
	int **arr3 =(int**)calloc(n,sizeof(int*));
	for(out=0;out<n;out++)
	{
		arr3[out] = (int*)calloc(3,sizeof(int));
	}
	
	int **arr4 =(int**)calloc(n,sizeof(int*)); 
	for(out=0;out<n;out++)
	{
		arr4[out] = (int*)calloc(3,sizeof(int));
	}	
	for(i=0;i<n;i++)
	{
		if(arr[i][1]>=h&&arr[i][2]>=h)//筛选第一梯队 
		{
			memcpy(arr1[ruwei1],arr[i],3*sizeof(int));
			ruwei1++;//入围第一梯队的数据量 
		}	
		
		else if(arr[i][1]>=h&&(arr[i][2]>=l&&arr[i][2]<h))//筛选第二梯队 
		{
			memcpy(arr2[ruwei2],arr[i],3*sizeof(int));
			ruwei2++;//入围第二梯队的数据量 
		}	

		else if((arr[i][1]>=l&&arr[i][1]<h)&&(arr[i][2]>=l&&arr[i][2]<h)&&(arr[i][1]>=arr[i][2]))//筛选第三梯队 
		{
			memcpy(arr3[ruwei3],arr[i],3*sizeof(int));
			ruwei3++;//入围第三梯队的数据量 
		}	

		else if(arr[i][1]>=l&&arr[i][2]>=l)//筛选第四梯队 
		{
			memcpy(arr4[ruwei4],arr[i],3*sizeof(int));
			ruwei4++;//入围第四梯队的数据量 
		}	
	
	}
	
	ruwei= ruwei1+ruwei2+ruwei3+ruwei4;
	printf("%d\n",ruwei);//输出入围选手数量 
	sort(arr1,ruwei1);	//排序第一梯队	
	sort(arr2,ruwei2);	//排序第二梯队
	sort(arr3,ruwei3);	//排序第三梯队		
	sort(arr4,ruwei4);	//排序第四梯队
	int f;
	for(f=0;f<n;f++)
	{
		free(arr[f]);
		free(arr1[f]);
		free(arr2[f]);
		free(arr3[f]);
		free(arr4[f]);		
	}
	free(arr);
	free(arr1);
	free(arr2);
	free(arr3);
	free(arr4);
	
	
	return 0;
}	


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值