题目链接:
A: 给出8*8的一个棋盘, W为A的棋子, B为B的棋子. 每个棋子只能向上或者向下走, 且不能覆盖或者跳跃棋子, 问你最终谁获胜.
模拟题, 遍历每一列, 记录最考上的W以及最靠下的B的位置.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 10;
char map[MAXN][MAXN];
int a = MAXN, b = MAXN;
int main(int argc, char const *argv[])
{
for(int i = 0; i < 8; ++i)
scanf("%s", map[i]);
for(int j = 0; j < 8; ++j) {
bool flag = false;
for(int i = 0; i < 8; ++i) {
if(map[i][j] == 'W' && !flag) a = min(a, i);
if(map[i][j] == 'B') flag = true;
}
flag = false;
for(int i = 7; i >= 0; --i) {
if(map[i][j] == 'B' && !flag) b = min(b, 7 - i);
if(map[i][j] == 'W') flag = true;
}
}
if(a <= b) printf("A\n");
else printf("B\n");
return 0;
}
规律题, 自己画几组后就发现答案为(n - 2) ^ 2.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
typedef long long ll;
int main(int argc, char const *argv[])
{
ll n;
scanf("%lld", &n);
n -= 2;
printf("%lld\n", n * n);
return 0;
}
C: 有一个跑道, 终点为1 ~ t - 1, 两个人的步速分别为w, b, 问你选择平等的概率是多少.
数学题, 注意到数据的范围, 将要比较的数据转化为double型运用log()函数就可以解决. 通过gcd, lcm即可解决.
AC代码:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "cmath"
using namespace std;
typedef long long ll;
ll t, w, b;
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b)
{
return a / gcd(a, b) * b;
}
bool judge(ll a, ll b, ll c)
{
if(log(1.0 * a) + log(1.0 * b) - log(1.0 * gcd(a, b)) > log(1.0 * c)) return true;
return false;
}
int main(int argc, char const *argv[])
{
scanf("%lld%lld%lld", &t, &w, &b);
if(w == b) {
printf("1/1\n");
return 0;
}
ll x, y = t;
if(judge(w, b, t)) x = min(w - 1, min(b - 1, t));
else {
ll l = lcm(w, b), g = t / l;
if(l * g + min(w, b) <= t) x = (g + 1) * min(w, b) - 1;
else x = g * (min(w, b) - l) + t;
}
printf("%lld/%lld\n", x / gcd(x, y), y / gcd(x, y));
return 0;
}