工程师小王想要从海量的网络数据中,筛选出忙时数据。由于是海量数据,小王没办法对海量数据进行排序,再取 topN 的忙时数据 (将数据从大到小排序,取前 N 个)。聪明的小王想到了使用固定大小的优先级队列来进行数据筛选。为了场简化,我们用正整数集来表示海量的网络数据,同时只取 N 个忙时数据,也即只取 个最大的正整数。针对每一批数据输入,单独输出一行结果,直接将 个正整数拼接完完整的一行字符串输出即可。
A = [] n, m = map(int, input().split()) for _ inrange(m): a, b = map(int, input().split()) A = list(reversed(sorted(A + [b] * min(n, a))))[:n] print("".join(str(x) for x in A))
整个 A 地区是一个矩形区域。
前期技术人员,按照一块太阳能板覆盖的面积,将 A 地区内部划分为 个地块提前勘测并计算出每一个地块的年发电收入,使用 的发电收入矩阵表示。为了减少管理成本,充分利用土地,必须选择一个矩形区域进行排列安装。
请实现功能,求出发电站应安装多少块太阳能板,年利润最大,最大为多少。
输入
第一行包含两个正整数:m、n,空格分隔。表示 A 地区分成的 个地块;0 < m、n < 1024。
后续 n 行,每行 m 个正整数,空格分隔。表示每个小块区域的太阳能板年发点收入。0
<= 收入 < 100。
#include<bits/stdc++.h> usingnamespace std; constint N = 1030; int s[N][N], n, m; intmain(){ scanf("%d %d", &m, &n); for (int i = 1; i <= n; i++){ for (int j = 1; j <= m; j++){ scanf("%d", &s[i][j]); s[i][j] = s[i][j] - 5; } } if (n > m){ for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) if (i < j) swap(s[i][j], s[j][i]); swap(n, m); } for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) s[i][j] = s[i - 1][j] + s[i][j]; int ans = -2e9, cnt = 0; for (int d = 1; d <= n; d++){ for (int u = 0; u < d; u++){ int p = 0, mn = 0, sum = 0; for (int j = 1; j <= m; j++){ int x = s[d][j] - s[u][j]; sum += x; int y = (j - p) * (d - u); if (sum - mn > ans || sum - mn == ans && y < cnt){ ans = sum - mn; cnt = y; } if (sum <= mn){ mn = sum; p = j; } } } } printf("%d %d\n", cnt, ans); }