202140428牛客小白月赛—三角尼克(贪心思维)

24 篇文章 0 订阅
24 篇文章 0 订阅

链接: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倍差距的样子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值