K11720 Milk Measurement-B[USACO-2017-Dec-B]
时间: 2023-07-16 19:12:20 浏览: 68
题目描述
农夫约翰正在研究他的奶牛的产奶量。为此,他记录了每头奶牛在一段时间内产生的牛奶量,并将这些牛奶储存在单独的桶中。
农夫约翰想要了解桶内的牛奶量是否在某个时间段内呈现出了增长趋势。更具体地说,他想要知道是否存在一个时间段(可能是一天,一周或一个月),使得在此期间内,桶内的牛奶量的平均值比前一个时间段内的平均值高。
例如,如果桶中的牛奶量按时间顺序存储为3,4,5,3,则牛奶量的平均值按顺序为3,(3 + 4)/2 = 3.5,(3 + 4 + 5)/3 = 4,(4 + 5 + 3)/3 = 4,其中第二个时间段(3到5)的平均值更高。
给定桶中的牛奶量历史记录,确定是否存在增长时间段。
输入格式
第1行包含整数N,表示桶中牛奶量的历史记录数。
接下来N行,每行包含一个0到1,000,000之间的整数,表示桶中的牛奶量。
输出格式
如果存在增长时间段,则输出1,否则输出0。
数据范围
2≤N≤100,000
输入样例#1:
6
3
4
5
3
8
9
输出样例#1:
1
输入样例#2:
5
1
5
10
5
20
输出样例#2:
0
算法
(滑动窗口) $O(n)$
时间复杂度
本算法的时间复杂度为 $O(n)$
空间复杂度
本算法的空间复杂度为 $O(1)$
C++ 代码
Python3 代码
java 代码
相关问题
K11720 Milk Measurement-B[USACO-2017-Dec-B]代码
以下是K11720 Milk Measurement-B[USACO-2017-Dec-B]的Python代码实现:
```
n, g = map(int, input().split())
cow_info = []
for i in range(n):
cow_info.append(list(input().split()))
# 按照时间顺序排序
cow_info.sort(key=lambda x: int(x[0]))
# 初始化奶量
milk = {g: 0}
# 记录最大奶量变化次数
change_times = 0
for i in range(n):
time, cow_id, milk_amount = cow_info[i]
milk_amount = int(milk_amount)
# 更新奶牛奶量
if cow_id in milk:
milk[cow_id] += milk_amount
else:
milk[cow_id] = milk_amount
# 计算当前最大奶量
max_milk = max(milk.values())
# 如果当前最大奶量与之前不同,则更新计数器
if max_milk != milk[g]:
change_times += 1
milk[g] = max_milk
print(change_times)
```
首先,我们读入输入的数据。然后按时间顺序排序,以便以正确的顺序处理每个奶牛。
接下来,我们初始化一个字典`milk`,其中键是奶牛的ID,值是奶量。我们还将字典初始化为只有一头奶牛(ID为`g`)的奶量为0。
然后,我们按顺序遍历每个奶牛的信息,更新`milk`字典中相应奶牛的奶量。计算当前最大的奶量,如果与之前的最大奶量不同,则更新计数器`change_times`并更新字典`milk`中`g`奶牛的奶量为当前最大奶量。
最后,输出计数器`change_times`即可。
K11720 Milk Measurement-B[USACO-2017-Dec-B]c++代码
以下是题目和代码:
题目描述:
农夫约翰想要了解他的奶牛们每天产生的牛奶量。他有 $N$ 头奶牛,编号为 $1,2,…,N$,他想要在连续的 $M$ 天里知道这些奶牛的总产量。他记录了每头奶牛在这 $M$ 天里每天产生的牛奶数量。
每天的奶牛产量都是非负的,但不一定相同。约翰想要知道哪些奶牛在这 $M$ 天里总共产生了至少 $G$ 加仑的牛奶。请帮助约翰找出这些奶牛。由于总共有 $N$ 头奶牛,你的算法的时间复杂度至多为 $O(NM)$,否则你可能会超时。
输入格式
第一行包含三个整数 $N,G,M$。
接下来 $N$ 行,每行包含 $M$ 个整数,表示每头奶牛在这 $M$ 天里每天的产量。
输出格式
每行输出一个奶牛的编号,表示这些奶牛中的每一头最少产出了 $G$ 加仑的牛奶。
输出这些编号的顺序应该与它们在输入中出现的顺序相同。
如果没有奶牛的总产量至少为 $G$ 加仑,则输出 NONE。
数据范围
$1≤N,M≤1000$
$0≤G≤10^9$
输入样例:
5 24 2
15 20
20 10
25 18
30 32
40 50
输出样例:
1
2
3
4
c++ 代码:
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1010;
int n, g, m;
int sum[N][N]; //记录前缀和
vector<int> ans;
int main()
{
cin >> n >> g >> m;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
{
int x;
cin >> x;
sum[i][j] = sum[i][j - 1] + x;
}
for (int i = 1; i <= n; ++i)
{
int s = 0;
for (int j = 1; j <= m; ++j)
s += sum[i][min(j + m - 1, m)] - sum[i][j - 1];
if (s >= g * m) ans.push_back(i);
}
if (ans.empty()) puts("NONE");
else
for (auto x : ans) cout << x << endl;
return 0;
}
```