PAT-乙级 1032 挖掘机技术哪家强(C语言)

这篇博客介绍了在解决PAT乙级1032题目的过程中,如何优化代码以减少内存申请。作者强调了尽管优化后的代码看起来复杂,但逻辑并不难理解,并且提出使用链表可以进一步节省内存,鼓励读者尝试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码中的注释部分为调试时所加,删去无影响

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

struct studentData{
	int Id;
	int achievement;
};

int main() {
	//获取数据
	int inputNumbers;
	scanf("%d", &inputNumbers);
	struct studentData* pointer;
	pointer = calloc(inputNumbers, sizeof(struct studentData));
	int i;
	for (i = 0; i < inputNumbers; i++){
		scanf("%d", &(pointer+i)->Id);
		scanf("%d", &(pointer + i)->achievement);
	}
	//存放总成绩的数组
	int* intPointer;
	intPointer = calloc(inputNumbers + 1, sizeof(int));
	int input=1;
	//放进去
	while (input<=inputNumbers) {
		i = (pointer + input - 1)->Id;
		*(intPointer + i) += (pointer + input - 1)->achievement;
		input++;
	}
	/*for (i = 1; i <= inputNumbers; i++) {
		printf("%d\n", *(intPointer + i));
	}*/
	//printf("...........................");
	int max = 0,max_id=0;
	for (i = 1; i <= inputNumbers; i++) {
		if (*(intPointer + i) > max) {
			max = *(intPointer + i);
			max_id = i;
		}
	}
	printf("%d %d", max_id,max);
	free(intPointer);
	free(pointer);
	//system("pause");
	return 0;
}

又改了下,尽量少向系统申请一些内存,虽然看起来复杂,其实逻辑上并不难

#include <stdio.h>

struct studentData {
	int id;
	int achievement;
};

int main() {
	int inputNumbers;
	scanf("%d", &inputNumbers);
	struct studentData* dataPointer;
	dataPointer = calloc(inputNumbers, sizeof(struct studentData));
	int i, arrayNumber=0;
	for (i = 0; i < inputNumbers; i++) {
		scanf("%d", &(dataPointer + i)->id);
		scanf("%d", &(dataPointer + i)->achievement);
		if ((dataPointer + i)->id > arrayNumber)
			arrayNumber = (dataPointer+i)->id;
	}
	int* arrayPointer;
	arrayPointer = calloc(arrayNumber + 1, sizeof(int));
	for (i = 0; i < inputNumbers;i++) {
		*(arrayPointer + (dataPointer + i)->id) += (dataPointer + i)->achievement;
	}
	int max = 0, max_id = 0;
	for (i = 1; i <= arrayNumber; i++) {
		if (*(arrayPointer + i) > max) {
			max = *(arrayPointer + i);
			max_id = i;
		}
	}
	printf("%d %d", max_id, max);
	free(dataPointer);
	free(arrayPointer);
	//system("pause");
	return 0;
}

此外,如果使用链表,可以更省一些内存,有兴趣的可以试试

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值