首页 » Blog » CCF-CSP 2018-09

CCF-CSP 2018-09

第一题:

#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的右端点左边,且两者相交,这个加一下然后往下迭代就可以。

A Junior student in BUPT.

发表回复