题目链接.
算法思想
依题意,对从第2行开始的每一行的后边,只需要求得从第2个开始的疏果数总数,把它当作一个整体就好。比较大小计算P和k的时候,就只需要它了。至于T就更简单了,把下面所有数据加起来就好。
其实不需要线性表结构的,每次一读入数据就顺便计算就非常方便
#include<iostream>
using namespace std;
//小明种苹果
long long int N, M, m; //我就不懂了,只是把这行从 "int" 换成 "long long int",就从0分跳到了100分
long long int T = 0, k = 1, P = 0;
long long int apple_initial = 0, apple_cut = 0, apple_end = 0;
//apple_initial 初始苹果数,apple_cut 疏果数(cut < 0), apple_end 最后剩余苹果数
int main()
{
long long int i;
scanf("%lld%lld", &N, &M);
for (i = 1; i <= N; i++)
{
scanf("%lld", &apple_initial);
apple_end = apple_initial;
m = M;
while (m--)
{
scanf("%lld", &apple_cut);
apple_end += apple_cut;
}
T += apple_end;
if (P < (apple_initial - apple_end))//可以保证并列最多时,取编号较小的苹果树
{
k = i;
P = apple_initial - apple_end; //疏果个数最多的
}
}
printf("%lld %lld %lld", T, k, P);
return 0;
}
结果分析
得分100分,用时468ms,空间使用2.531MB,时间复杂度O(N*M)。