A、Hotelier
暴力
#include<bits/stdc++.h>
#define sc scanf
#define pr printf
using namespace std;
int a[15];
int main()
{
int n;
sc("%d", &n);
getchar();
for (int i = 1; i <= n; i++)
{
char s = getchar();
if (s == 'L')
{
for (int i = 0; i <= 9; i++)
{
if (a[i] == 0)
{
a[i] = 1;
break;
}
}
}
else if (s == 'R')
{
for (int i = 9; i >= 0; i--)
{
if (a[i] == 0)
{
a[i] = 1;
break;
}
}
}
else
{
a[s - '0'] = 0;
}
}
for (int i = 0; i <= 9; i++)
printf("%d", a[i]);
}
B、Block Adventure
让左边尽量等于右边减 k ,注意判断小于0的情况
#include<bits/stdc++.h>
#define sc scanf
#define pr printf
using namespace std;
int a[105];
int main()
{
int T;
sc("%d", &T);
while (T--)
{
int n, m, k;
sc("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++)
sc("%d", &a[i]);
for (int i = 1; i < n; i++)
{
if (a[i] > a[i + 1] - k)
{
int qq = a[i + 1] - k;
qq = max(qq, 0);
m += a[i] - qq;
}
else
{
int qq = a[i + 1] - k;
qq = max(qq, 0);
int cha = qq - a[i];
if (m < cha)
{
printf("NO\n");
goto qwe;
}
else
m -= cha;
}
}
printf("YES\n");
qwe:;
}
}
C、Round Corridor
找找规律,这两块一共被分为了gcd(n,m) 块,求一下每块的个数,然后算一下在第几块里面,判一下相等就可以。
#include<bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
int main()
{
ll n, m, k;
scanf("%lld%lld%lld", &n, &m, &k);
ll g = gcd(n, m);
ll a, b, c, d;
ll q = n / g;
ll w = m / g;
while (k--)
{
scanf("%lld%lld%lld%lld", &a, &b, &c, &d);
b--; d--;
if (a == 1)
b /= q;
else
b /= w;
if (c == 1)
d /= q;
else
d /= w;
if (b == d)
printf("YES\n");
else
printf("NO\n");
}
}
D、White Lines
求出可以使当前这一行/列变成白线的左上顶点( i, j )的取值范围,然后用更新四个点来代替更新面积,然后扫一遍前缀和就可以
#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
char s[2005][2005];
int ans[2005][2005];
void update(int a, int b, int c, int d)//x1 y1 x2 y2
{
ans[a][b]++;
ans[c][d]++;
ans[a][d]--;
ans[c][b]--;
}
int main()
{
int n, k;
sc("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
scanf("%s", s[i] + 1);
int res = 0, yes = 0;
for (int i = 1; i <= n; i++)
{
int minn = 0, maxn = 0;
for (int j = 1; j <= n; j++)
{
if (s[i][j] == 'B')
{
maxn = j;
if (minn == 0)
minn = j;
}
}
if (minn == 0)
yes++;
else if (maxn - minn + 1 <= k)
update(max(0, i - k + 1), max(0, maxn - k + 1), i + 1, minn + 1);
}
for (int j = 1; j <= n; j++)
{
int minn = 0, maxn = 0;
for (int i = 1; i <= n; i++)
{
if (s[i][j] == 'B')
{
maxn = i;
if (minn == 0)
minn = i;
}
}
if (minn == 0)
yes++;
else if (maxn - minn + 1 <= k)
update(max(0, maxn - k + 1), max(0, j - k + 1), minn + 1, j + 1);
}
for (int i = 1; i <= n; i++)
{
ans[0][i] += ans[0][i - 1];
ans[i][0] += ans[i - 1][0];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
ans[i][j] = ans[i - 1][j] + ans[i][j - 1] - ans[i - 1][j - 1] + ans[i][j];
res = max(res, ans[i][j]);
}
}
printf("%d\n", res + yes);
}