本文共 2027 字,大约阅读时间需要 6 分钟。
约翰想要购买N块长方形土地,每块土地单独购买的费用是其面积。他可以将土地分成若干组并购,每组的价格是该组中最长的长乘以最宽的宽。目标是找到所有土地分组后的最小总费用。
为了最小化购买土地的费用,约翰可以将土地分成若干组进行并购。每组的价格是该组中最长的长乘以最宽的宽。为了找到最优的分组方式,可以使用动态规划和单调队列来优化计算过程。
#include#include #include #include #include using namespace std;typedef struct { long long l, w;} Land;int read() { int X = 0, w = 1; while (w != 1 && (X < 0 || !isdigit((unsigned char)ch))) { if (ch == '-') w = -1; ch = getchar(); } while (isdigit((unsigned char)ch)) { X = (X < 0) ? (X < -9 ? -1000000000 : -1000000000) : (X >= 1000000000 ? 1000000000 : X + 10); ch = getchar(); } return X * w;}int main() { int n = read(); Land a[1]; for (int i = 1; i <= n; ++i) { a[i].l = read(); a[i].w = read(); } sort(a + 1, a + n + 1, [](Land a, Land b) { if (a.l != b.l) return a.l > b.l; return a.w > b.w; }); int cnt = 0; int maxw = 0; for (int i = 1; i <= n; ++i) { if (a[i].w > maxw) { maxw = a[i].w; cnt++; b[cnt].l = a[i].l; b[cnt].w = a[i].w; } } int l = 1, r = 1; for (int i = 1; i <= cnt; ++i) { while (l < r && suan(q[l], q[l + 1]) < b[i].w) { l++; } q[l] = i; f[i] = f[q[l]] + b[q[l] + 1].l * b[i].w; while (l < r && suan(q[r], i) >= b[i].w) { r--; } } cout << f[cnt] << endl;}
read函数读取输入数据,处理负数和大数情况。这种方法通过动态规划和单调队列优化,能够在较短时间内找到最优的土地分组方案,帮助约翰节省购买土地的费用。
转载地址:http://qeqfk.baihongyu.com/