文章目录

  • 一.田地丈量
    • 1.题目内容
    • 2.题意简述
    • 3.题意分析
    • 4.完整代码
  • 二.垦田计划
    • 1.题目内容
    • 2.题意简述
    • 3.题意分析
    • 4.完整代码

一.田地丈量

1.题目内容


2.题意简述

在坐标轴上给定n个矩形,并计算n个矩形(不考虑重合)与小岛相交面积(绿色区域)的和。

3.题意分析

我们采用枚举的方法进行计算,也就是分成9部分也就是9种情况,时间复杂度O(N),不需要考察算法,只需要注意边界问题!
图解

4.完整代码

方法1:

#includeusing namespace std;int main() {int n, a, b;int x1, y1, x2, y2;long long int sum = 0;scanf("%d%d%d", &n, &a, &b);for (int i = 1; i <= n; i++) {scanf("%d%d%d%d", &x1, &y1, &x2, &y2);if(x1>=0&&y1>=0&&x2<=a&&y2<=b)sum+=(y2-y1)*(x2-x1);else if(x1<0&&x2>0&&y1<0&&y2>0)sum+=y2*x2;else if(x1>=0&&x2<=a&&y1<0&&y2>0)sum+=y2*(x2-x1);else if(x1<a&&x2>a&&y1<0&&y2>0)sum+=(a-x1)*y2;else if(x1<a&&x2>a&&y1>=0&&y2<=b)sum+=(y2-y1)*(a-x1);else if(x1<a&&x2>a&&y1<b&&y2>b)sum+=(b-y1)*(a-x1);else if(x1>=0&&x2<=a&&y1<b&&y2>b)sum+=(b-y1)*(x2-x1); else if(x1<0&&x2>0&&y1<b&&y2>b) sum+=x2*(b-y1);else if(x1<0&&x2>0&&y1>=0&&y2<=b)sum+=x2*(y2-y1);}printf("%lld",sum);return 0;}

方法2:

#include#includeusing namespace std;int x1, y1, x2, y2;int main() {int n, a, b, x, y;long long sum = 0;scanf("%d%d%d", &n, &a, &b);for (int i = 1; i <= n; i++) {scanf("%d%d%d%d", &x1, &y1, &x2, &y2);x = min(a, x2) - max(0, x1);y = min(b, y2) - max(0, y1);if (x >= 0 && y >= 0)sum += x * y;}printf("%lld", sum);return 0;}

补充:这里方法2使用max,min函数计算每个矩形和小岛相交面积的和,充分考虑边界问题,应该是最简便的方法。

提交结果

二.垦田计划

1.题目内容



2.题意简述

我们由若干田地,这些田地我们垦种,可以同时耕种,可以使用资源减少耕种时间,但耕种时间不少于k天。需要考虑如何分配资源使耕种天数最少?

3.题意分析

这里我们我们需要利用一个容器来存储对应的耕作消耗情况,这里我们利用容器cc[t[i]]=c[i],来进行存储,我们从高到低进行判断,因为考察的重心在最大值!

4.完整代码

#include#includeusing namespace std;const int N = 100100;typedef long long ll;ll t[N], c[N];ll cc[N];int main() {ll n, m, k, maxn = 0;cin >> n >> m >> k;for (int i = 0; i < n; i++) {cin >> t[i] >> c[i];cc[t[i]] += c[i];maxn = max(maxn, t[i]);}for (int i = maxn; i >= k; i--) {if (m > cc[i]) {if (i == k) {cout << k << endl;break;}m = m - cc[i];cc[i - 1] = cc[i - 1] + cc[i];}else{cout << i << endl;break;}}}

提交结果: