2021牛客暑期多校训练营1补题报告
2021牛客暑期多校训练营1补题报告
A. Alice and Bob
标签:博弈、暴力
题目大意
给你两堆石头,数量分别为n,m,Alice和Bob轮流拿石头,Alice先拿.
每次只能在一堆拿k(k>0)块,另一堆拿s*k块(s>=0).
谁先不能拿时,谁就输,问两人在合理进行游戏后,谁能赢.
解题思路
简单的博弈游戏,打表推即可.
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5e3;
bool f[N + 10][N + 10];
int main()
{
for (int i = 0; i <= N; i ++)
for (int j = 0; j <= N; j++)
{
if (f[i][j] == 0)
{
for (int k = 1; i + k <= N; k++)
for (int s = 0; k * s + j <= N; s++)
f[i + k][j + s * k] = 1;
for (int k = 1; k + j <= N; k++)
for (int s = 0; k * s + i <= N; s++)
f[i + s * k][j + k] = 1;
}
}
int _;
cin >> _;
while (_--) {
int n, m;
cin >> n >> m;
if (f[n][m]) cout << "Alice" << endl;
else cout << "Bob" << endl;
}
return 0;
}
B. Ball Dropping
标签:平面几何
题目大意
见题目原文
解题思路
利用三角形相似计算,注意判断球是否卡住不是 \(ans>=r\) ,而是 \(2*r>b\).
代码
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
double r, a, b, h;
cin >> r >> a >> b >> h;
double ans = sqrt(4 * h * h * r * r / ((a - b) * (a - b)) + r * r) - b * h / (a - b);
if (2 * r < b) printf("Drop\n");
else printf("Stuck\n%.6lf\n", ans);
return 0;
}
D. Determine the Photo Position
链接:Determine the Photo Position
标签:白给
题目大意
给一个n*n的01矩阵,0表示能放置的位置,1表示不能放置的位置.
问有多少个位置能放一个长度为m的串.
解题思路
直接计数即可
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
char c[N][N], b[N];
int calc(int m, int n) {
return n - m + 1;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i ++) cin >> c[i];
cin >> b;
long long ans = 0;
for (int i = 0; i < n; i ++)
{
for (int j = 0; j < n; j ++)
{
int cnt = 0;
while (j < n && c[i][j] == '0') cnt ++, j ++;
if(cnt >= m) ans += calc(m, cnt);
}
}
cout << ans << endl;
return 0;
}
F. Find 3-friendly Integers
标签:思维
题目大意
如果一个数的十进制表示下的某一连续段表示的数能被3整除,则称该数为3-friendly Integer.
现给你一个范围[l, r],问该范围内的3-friendly Integer的数量.
解题思路
分析发现,任意一个长度大于等于3的数都是3-friendly Integer.
只需暴力判断1~99范围内的3-friendly Integer并统计数量即可.
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
int b[N], f[N];
int main()
{
int n = 99;
for (int i = 1; i <= n; i ++) {
int m = 0, k = i;
while (k) b[m ++] = k % 10, k /= 10;
for (int l = 0; l < m; l ++) {
int res = 0;
for (int r = l; r < m; r ++) {
res += b[r];
if (res % 3 == 0) {
f[i] = true;
break;
}
}
}
}
for (int i = 1; i <= n; i ++) f[i] += f[i - 1];
int _;
cin >> _;
while (_ --) {
long long l, r;
cin >> l >> r;
if (r <= 99) cout << f[r] - f[l - 1] << endl;
else if (l <= 99) cout << f[99] - f[l - 1] + r - 99 << endl;
else cout << r - l + 1 << endl;
}
return 0;
}

浙公网安备 33010602011771号