第一题:
#include <iostream>
using namespace std;
int n = 0;
const int N = 1010;
int a[N], b[N];
int average(int a[], int k)
{
if (k == 0)
return a[k] + a[k + 1] >> 1;
else if (k == n – 1)
return a[k] + a[k – 1] >> 1;
else
return (a[k] + a[k – 1] + a[k + 1]) / 3;
}
int main()
{
scanf(“%d”, &n);
for (int i = 0; i < n; i++)
scanf(“%d”, &a[i]);
for (int i = 0; i < n; i++)
b[i] = average(a, i);
for (int i = 0; i < n; i++)
cout << b[i] << ” “;
return 0;
}
第二题:
#include <iostream>
#include <vector>
using namespace std;
int n = 0;
int main()
{
scanf(“%d”, &n);
vector<pair<int, int>> xw;
vector<pair<int, int>> xh;
int x, y;
for (int i = 0; i < n; i++)
{
scanf(“%d%d”, &x, &y);
xw.push_back(make_pair(x, y));
}
for (int i = 0; i < n; i++)
{
scanf(“%d%d”, &x, &y);
xh.push_back(make_pair(x, y));
}
int sum = 0;
vector<pair<int, int>>::iterator itr1 = xw.begin();
vector<pair<int, int>>::iterator itr2 = xh.begin();
while (itr1 != xw.end() && itr2 != xh.end())
{
if (itr1->first >= itr2->second)
itr2++;
else if (itr1->second <= itr2->first)
itr1++;
else if (itr2->second <= itr1->second)
{
sum += itr2->second – max(itr1->first, itr2->first);
itr2++;
}
else if (itr1->second <= itr2->second)
{
sum += itr1->second – max(itr1->first, itr2->first);
itr1++;
}
}
printf(“%d”, sum);
return 0;
}
这一题还是有点意思的:总的来说因为题目给了每个区间都是不相交的,所以对于每个人的装车时间段分号区间。然后两个人的每个时间区间分情况就行,注意是每个时间区间,当一个时间区间处理完后可以处理下一个,所有的时间区间都可以包含在以下情况:
1.A的左端点在B的右端点右边,A的右端点在B的左端点左边,不相交。
2.A的右端点在B的右端点左边,且两者相交,这个加一下然后往下迭代就可以。