codeforces#515.div3

A. Vova and Train

水题,[1,n]能被m整除的数的个数为n/m

B. Heaters

贪心

#include <bits/stdc++.h>
#include <cstdio>

const int MAXN = 2000 + 2;

bool flag = false;
int n, r, cnt;
int a[MAXN], b[MAXN];

void work(int pos) {
    for (int i = std::max(pos - r + 1, 1); i <= std::min(pos + r - 1, n); i++)
        b[i] = 1;
}

int main()
{
    scanf("%d %d", &n, &r);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
    }

    for (int i = 1; i <= n; i++) {
        flag = false;
        if (!b[i]) {
            for (int j = std::max(i + r - 1, 1); j >= std::min(i - r + 1, n); j--) {
                if (a[j]) {
                    work(j);
                    cnt++;
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                printf("-1\n");
                return 0;
            }
        }
    }
    printf("%d\n", cnt);
    return 0;
}

C. Books Querie

一共维护三个东西,编号为x的书的位置,最左边空位的位置以及最右边空位的位置

#include<bits/stdc++.h>
using namespace std;
#define maxn 200010
int main()
{
    int a[maxn];
    int l=100000;
    int r=100000;
    int q;
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        char ch;
        int x;
        cin>>ch>>x;
        if(ch=='L')
        {
            a[x]=l--;
            if(i==1) r++;
        }
        else if(ch=='R')
        {
            a[x]=r++;
            if(i==1) l--;
        }
        else
        {
            cout<<min(a[x]-l+1,r-a[x]+1) - 2<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hzaukotete/article/details/83095767