2021牛客暑期多校训练营1补题报告

2021牛客暑期多校训练营1补题报告

A. Alice and Bob

链接: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

链接: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

链接: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;
}
posted @ 2021-08-05 14:02  nodot08  阅读(35)  评论(0)    收藏  举报