https://ac.nowcoder.com/acm/problem/15523
根据题目的意思,输入有两组数组,分别表示两个台的节目的开始时间及单位愉悦度,因为这两个数据关联性较强,使用我们使用结构体将它们相连。
struct kat
{
int x = 0, y = 0;
};
我们用x表示时间,y表示愉悦度
在读入数据之后,我们利用函数对其进行排序,然后就是本题的难点
首先,我们设定两个变量a1,b1并赋初值0
它们表示的是此时两个台是第几个节目
然后,我们可以另设一个int型数num1,用它来表示a1,b1的后一个节目的时间 x的较小值 ,num2用来表示此时a1,b1表示的愉悦度的较大值
这时,我们另设一个值ans用来表示最终输出值
需要注意的是,题目中的愉悦度的区间是-100~100,也就是说它是可以为负值的,所以需要注意条件
当num2大于0时,ans就加上num2乘以当前时间段
然后将目前时间k赋值num1,如果k等于a1或b1的后一个值时,就让a1或b1右移一位
该过程代码如下
while (k < t)
{
num1 = min(a[a1 + 1].x, b[b1 + 1].x);
num2 = max(a[a1].y, b[b1].y);
if (num2 > 0)ans += num2 * (num1 - k);
k = num1;
if (k == a[a1 + 1].x)a1++;
if (k == b[b1 + 1].x)b1++;
}
不过,在这个过程中需要注意数组的区间
加上以下代码就可以保障数据不会出错
a[n].x = t; b[m].x = t;
a[n].y = 0; b[m].y = 0;
下面是AC代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<stack>
#include<cstdlib>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
struct kat
{
int x = 0, y = 0;
};
bool cmp(kat a, kat b)
{
return a.x < b.x;
}
int main()
{
int n, m, num;
int t, k = 0;
ll ans = 0;
cin >> n >> m >> t;
kat a[maxn], b[maxn];
for (int i = 0; i < n; i++)cin >> a[i].x >> a[i].y;
for (int i = 0; i < m; i++)cin >> b[i].x >> b[i].y;
sort(a , a + n, cmp);
sort(b , b + m, cmp);
int a1 = 0, b1 = 0, num1, num2;
a[n].x = t; b[m].x = t;
a[n].y = 0; b[m].y = 0;
while (k < t)
{
num1 = min(a[a1 + 1].x, b[b1 + 1].x);
num2 = max(a[a1].y, b[b1].y);
if (num2 > 0)ans += num2 * (num1 - k);
k = num1;
if (k == a[a1 + 1].x)a1++;
if (k == b[b1 + 1].x)b1++;
}
cout << ans << endl;
return 0;
}