程序员测试题:PAT 乙级 1015 德才论2(调整格式后) (C语言版本)
思路:
设置了打印函数,把打印放在主函数中运行,将pri1、pri2等数组利用上
#include <stdio.h>
#include <string.h>
#include <math.h>
void pri(int arrin[100000][3],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");
}
}
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<ruwei;i++)//求数组中的最大值
{
sum = inarr[i][1]+inarr[i][2];
if(sum>max)
{
max=sum;
memcpy(outarr[jj],inarr[i],3*sizeof(int));//数组赋值等同于:
/*
outarr[jj][0] = inarr[i][0];
outarr[jj][1] = inarr[i][1];
outarr[jj][2] = inarr[i][2];
*/
temp = i; //记录最后的i值,此时outarr最大。
}
}
for(;temp<ruwei;temp++)//从temp之后依次前进一格,将最大值覆盖掉,然后从剩下的数值中在找最大值
{
memcpy(inarr[temp],inarr[temp+1],3*sizeof(int));
}
max=0; //max清零,重新进入循环取最大值
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[jjjj][1]+outarr[jjjj][2])==(outarr[jjjj+1][1]+outarr[jjjj+1][2])&&(outarr[jjjj][1]==outarr[jjjj+1][1]))
{
if(outarr[jjjj][0]>outarr[jjjj+1][0])
{
memcpy(temparr,outarr[jjjj],3*sizeof(int));
memcpy(outarr[jjjj],outarr[jjjj+1],3*sizeof(int));
memcpy(outarr[jjjj+1],temparr,3*sizeof(int));
}
}
}
}
// pri(outarr,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 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;
scanf("%d %d %d",&n,&l,&h);
int ii,jj;
for(ii=0;ii<n;ii++)
{
for(jj=0;jj<3;jj++)
{
scanf("%d",&arr[ii][jj]);
}
}
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); //排序第一梯队
pri(pri1,ruwei1);
sort(arr2,pri2,ruwei2); //排序第二梯队
pri(pri2,ruwei2);
sort(arr3,pri3,ruwei3); //排序第三梯队
pri(pri3,ruwei3);
sort(arr4,pri4,ruwei4); //排序第四梯队
pri(pri4,ruwei4);
}
只是调整了格式,未能改变结果。