signed

QiShunwang

“诚信为本、客户至上”

程序员测试题:PTA 乙级 1015 德才论 (C语言版本)

2021/1/28 15:12:31   来源:

程序员测试题:PTA 乙级 1015 德才论1(最笨的办法) (C语言版本)

PTA题目
思路:
将数据分成四个梯队,在排序函数中,分别输出排序后的数值。特别有意思的是,这里开辟了大量的全局变量数组,因为如果数组时局部变量,哪怕设置一个10万数组的局部变量,运行时程序就崩溃了,大概算了算,一个这样的数组需要开辟:10万乘4乘3个字节,也就是120万字节,约等于1.2mb。

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

void sort(int inarr[100000][3],int outarr[100000][3],int ruwei)
{

	int ii=0,jj=0,max=0,sum=0;
	int i,j=0,temp=0;	
	for(ii=0;ii<ruwei;ii++)
	{
		
		for(i=0;i<100000;i++)//求数组中的最大值
		{
			sum = inarr[i][1]+inarr[i][2];
			if(sum>max) 
			{
				max=sum;
				outarr[jj][0] = inarr[i][0];
				outarr[jj][1] = inarr[i][1];
				outarr[jj][2] = inarr[i][2];
				temp = i; //记录最后的i值,此时outarr最大。
				max=0; //max清零,重新进入循环 
			}							
		}
		
		for(;temp<ruwei;temp++)//从temp之后依次前进一格,将最大值覆盖掉,然后从剩下的数值中在找最大值 
		{
			inarr[temp][0] = inarr[temp+1][0];
			inarr[temp][1] = inarr[temp+1][0];
			inarr[temp][2] = inarr[temp+1][0];
		} 
		jj++;//把最大值放到arr[j][]中 ,jj从0到ruwei
//		printf("%d\t",jj);
		
	}
	//重复的根据德分排序
	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((outarr[jjj][1]+outarr[jjj][2])==(outarr[jjj+1][1]+outarr[jjj+1][2]))
			{
				if(outarr[jjj][1]<outarr[jjj+1][1])
				{
					memcpy(temparr,outarr[jjj],3*sizeof(int));
					memcpy(outarr[jjj],outarr[jjj+1],3*sizeof(int));
					memcpy(outarr[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((outarr[jjj][1]+outarr[jjj][2])==(outarr[jjj+1][1]+outarr[jjj+1][2])&&(outarr[jjj][1]==outarr[jjj+1][1]))
			{
				if(outarr[jjj][0]>outarr[jjj+1][0])
				{
					memcpy(temparr,outarr[jjj],3*sizeof(int));
					memcpy(outarr[jjj],outarr[jjj+1],3*sizeof(int));
					memcpy(outarr[jjj+1],temparr,3*sizeof(int));	
				}
			}
		}
	} 
		 
	int p;
	for(p=0;p<jj;p++)
	{
		
		for(i=0;i<3;i++)
		{
			printf("%d",outarr[p][i]);
			if(i<2)
			printf(" ");
			
		}
		printf("\n");		
	}	
//	printf("%d\n",temp);
	

	
}


	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 pri1[100000][3] = {0};
	int pri2[100000][3] = {0};
	int pri3[100000][3] = {0};
	int pri4[100000][3] = {0};


int main(){
	
	int n,l,h;
//	n=14,l=60,h=80;
	scanf("%d %d %d",&n,&l,&h);
	int ii,jj;	
//	int arr[10000][3] = {0};
	for(ii=0;ii<n;ii++)
	{
		for(jj=0;jj<3;jj++)
		{
			scanf("%d",&arr[ii][jj]);				
		}
	
	}
/*	for(ii=0;ii<n;ii++)
	{
		
		for(jj=0;jj<3;jj++)
		{
			printf("%d ",arr[ii][jj]);			
		}
		printf("\n");	
	}

*/

	int i=0,j=0;
	int ruwei=0;
	int ruwei1=0;
	int ruwei2=0;
	int ruwei3=0;
	int ruwei4=0;
	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,pri1,ruwei1);	//排序第一梯队
	sort(arr2,pri2,ruwei2);	//排序第二梯队 
	sort(arr3,pri3,ruwei3);	//排序第三梯队	
	sort(arr4,pri4,ruwei4);	//排序第四梯队





	return 0;	
	
	
}	

此种办法,可以通过几个测试点,其余的超时,下一篇带来一些优化的方法,降低运行时间

在这里插入图片描述