题目链接: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
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;
}