PAT(B) 1092 最好吃的月饼(C)统计

68 篇文章 3 订阅
27 篇文章 3 订阅

题目链接:1092 最好吃的月饼 (20 point(s))

题目描述

月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种。

月饼

若想评比出一种“最好吃”的月饼,那势必在吃货界引发一场腥风血雨…… 在这里我们用数字说话,给出全国各地各种月饼的销量,要求你从中找出销量冠军,认定为最好吃的月饼。

输入格式

输入首先给出两个正整数 N(≤1000)和 M(≤100),分别为月饼的种类数(于是默认月饼种类从 1 到 N 编号)和参与统计的城市数量。

接下来 M 行,每行给出 N 个非负整数(均不超过 1 百万),其中第 i 个整数为第 i 种月饼的销量(块)。数字间以空格分隔。

输出格式

在第一行中输出最大销量,第二行输出销量最大的月饼的种类编号。如果冠军不唯一,则按编号递增顺序输出并列冠军。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例

5 3
1001 992 0 233 6
8 0 2018 0 2008
36 18 0 1024 4

输出样例

2018
3 5

分析?

执迷于Java的我一直TLE,无奈只能用C语言写了。

然而,执迷于效率的我又写了两个版本的C代码。。。

V1.0直接用一维数组,然后遍历找到最大销量,再次遍历并输出编号。
V2.0用的是结构体数组和排序。输出排名靠前并且销量最高的编号即可。

然后提交了好多好多次,发现最短时间都是12ms。。。。?

C代码v1.0

/**********************************************************************************
Submit Time			Status		Score	Problem	Compiler	Run Time	User
8/2/2019, 20:51:58	Accepted	20		1092	C (gcc)		12 ms		wowpH
**********************************************************************************/
#include<stdio.h>
#include<memory.h>

int main() {
	int n, m, temp;
	scanf("%d %d", &n, &m);
	int sales[1001];						// 月饼销量,下标从1开始
	memset(sales, 0, sizeof(sales));		// 初始化为0
	for (int i = 0; i < m; ++i) {			// m个城市
		for (int j = 1; j <= n; ++j) {		// n种月饼
			scanf("%d", &temp);				// 第i种月饼销量
			sales[j] += temp;				// 第i种月饼总销量
		}
	}

	int maxSales = 0;						// 最大销量
	for (int i = 1; i <= n; ++i) {
		if (sales[i] > maxSales) {			// 第i中月饼比最大销量大
			maxSales = sales[i];			// 更新最大销量
		}
	}

	printf("%d\n", maxSales);				// 输出最大销量
	for (int i = 1; i <= n; ++i) {
		if (sales[i] == maxSales) {			// 是最大销量
			printf("%d", i);				// 输出编号,第一个最大销量的月饼
			for (i = i + 1; i <= n; ++i) {
				if (sales[i] == maxSales) {
					printf(" %d", i);		// 输出空格和编号,其他最大销量的月饼
				}
			}
			break;							// 退出循环
		}
	}
	return 0;
}

提交结果v1.0

1-1

C代码v2.0

/**********************************************************************************
Submit Time			Status		Score	Problem	Compiler	Run Time	User
8/2/2019, 20:47:19	Accepted	20		1092	C (gcc)		12 ms		wowpH
**********************************************************************************/
#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
	int id, sales;								// 编号和总销量
}MoonCake;										// 月饼

int cmp(const MoonCake* a, const MoonCake* b) {	// 排序
	if (a->sales != b->sales) {
		return b->sales - a->sales;				// 销量降序
	}
	if (a->id != b->id) {
		return a->id - b->id;					// 编号升序
	}
	return 0;
}

int main() {
	int n, m, temp;
	scanf("%d %d", &n, &m);

	MoonCake cake[1000];						// 月饼,下标从0开始
	for (int i = 0; i < n; ++i) {
		cake[i].id = i + 1;						// 编号从1开始
		cake[i].sales = 0;						// 初始化总销量为0
	}

	for (int i = 0; i < m; ++i) {				// m个城市
		for (int j = 0; j < n; ++j) {			// n种月饼
			scanf("%d", &temp);					// 第j种月饼在第i个城市的销量
			cake[j].sales += temp;				// 第j种月饼的总销量增加
		}
	}

	qsort(cake, n, sizeof(MoonCake), cmp);		// 排序

	printf("%d\n%d", cake[0].sales, cake[0].id);// 输出最大销量和第一个最大销量的编号
	for (int i = 1; i < n && cake[i].sales == cake[0].sales; ++i) {
		printf(" %d", cake[i].id);				// 空格和剩余最大销量的月饼编号
	}
	return 0;
}

提交结果v2.0

2-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值