記事のディレクトリ
アルゴリズムのアイデア
質問の意味によると、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ポイント、時間は468ミリ秒、スペースは2.531MB、時間計算量はO(N * M)です。