链接:https://ac.nowcoder.com/acm/contest/11210/I
来源:牛客网
题目描述
给出一个正三角形棋盘,两方必须轮流在棋盘上摆放棋子,每次可以摆放一枚或三枚棋子,但所摆放的棋子必须相连一直线,且一格中最多只能放一枚棋子,放下最后一枚棋子的人是输家。
下图给出了在 {N=8}N=8 时的一些可行的动作:
链接:https://ac.nowcoder.com/acm/contest/11210/I
来源:牛客网
这个时候,“Bob” 和 “Alice” 在这个棋盘上下棋,且总是 “Bob” 先手,请问谁会胜。
输入描述:
第一行一个正整数 {T, 1\le T \le 10}T,1≤T≤10,代表测试数据的组数
每组输入在一行中给出一个正整数 {N}N,代表三角形棋盘的变长
1 \le N \le 1001≤N≤100
输出描述:
每组输入在一行中输出胜者
示例1
输入
复制
2
1
2
输出
复制
Alice
Alice
思路:就算出棋盘的个数,一个一个放就行了。没必要放三个,效果一样。然后就根据奇偶性判断。
然后n(n+1)/2与(n+1)/2的奇偶性一样,就可以直接判断了。
代码:
#include <iostream>
#include <cstring>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10, M = 1e6 + 10;
map<string, int> mp;
map<string, int> ma[105];
string s[105];
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
int h[N], e[M], w[M], ne[M], idx;
int q[N], dist[N];
bool st[N];
void spfa() // 求1号点到n号点的最短路距离
{
int hh = 0, tt = 0;
memset(dist, 0x3f, sizeof dist);
dist[1] = 0;
q[tt ++ ] = 1;
st[1] = true;
while (hh != tt)
{
int t = q[hh ++ ];
if (hh == N) hh = 0;
st[t] = false;
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (dist[j] > dist[t] + w[i])
{
dist[j] = dist[t] + w[i];
if (!st[j]) // 如果队列中已存在j,则不需要将j重复插入
{
q[tt ++ ] = j;
if (tt == N) tt = 0;
st[j] = true;
}
}
}
}
}
void cou(ll a, ll b) {
ll p = a % b;
if(p != 0) {
cout << '{' << a / b << "+1/";
cou(b, p);
cout << '}';
}
else {
cout << a / b;
}
}
int getcnt(int pa, int pb, int a, int b) {
int cnt = 0;
while(pa >= a || pb >= b) {
if(pa >= a) {
cnt = cnt + pa / a;
pb = pb + pa / a;
pa = pa % a;
}else {
cnt = cnt + pb / b;
pa = pa + pb / b;
pb = pb % b;
}
}
return cnt;
}
int main() {
std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);//关同步
int t;
cin >> t;
while(t --) {
int n;
cin >> n;
int cnt = (n + 1) / 2;
if(cnt & 1) cout << "Alice" << endl;
else cout << "Bob" << endl;
}
return 0;
}
前面的代码不要管就行了,就只要看主函数。
其中std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);//是用来关同步的,也就是平时用cin,cout输入时间比较久,这个操作加速读入,但是还是没有scanf,printf来的快,大概是5倍差距的样子。