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;
}