bzoj 3298: [USACO 2011Open]cow checkers -- 数学

3298: [USACO 2011Open]cow checkers

Time Limit: 10 Sec  Memory Limit: 128 MB

Description

   一天,Besssie准备和FJ挑战奶牛跳棋游戏。这个游戏上在一个M*N(1<=M<=1,000,000;1<=N<=1,000,000)的棋盘上, 
这个棋盘上在(x,y)(0<=x棋盘的左下角是(0,0)坐标,棋盘的右上角是坐标(M-1,N-1)。 
Bessie每次都是第一个移动棋子,然后Bessie与Fj轮流移动。每一轮可以做以下三种中的一种操作:  
1)在同一行,将棋子从当前位置向左移动任意格; 
2)在同一列,将棋子从当前位置向下移动任意格;  
3)将棋子从当前位置向下移动k格再向左移动k格(k为正整数,且要满足移动后的棋子仍然在棋盘上)

第一个不能在棋盘上移动的人比赛算输(因为棋子处在(0,0)点)。 
共有T个回合(1<=T<=1,000),每次给出一个新起始点的坐标(x,y),确定是谁赢。

Input

第1行:两个用空格隔开的整数M和N;  
第2行:一个整数T;  
第3到第T+2行:两个用空格隔开的整数x和y.

Output

 

第1到T行:包含“Farmer John”或者是“Bessie”,表示谁赢了这轮游戏。




Sample Input

3 3
1
1 1

Sample Output

Bessie

HINT

分析必败点,可以发现,必败点的同一行,同一列,同一对角线上的点都是必胜点

所以可知,每一列都只有一个点,并且这些点沿对角线对称

然后就可以O(n) 递推求出每一列的必败点,然后直接回答即可

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 1000000007
#define ll long long
#define N 1000000
inline int rd()
{
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int a[N+10],n,m,T;
int main()
{
    a[1]=1;int tp=1;
    for(int i=1;i<=N;i++)
    {
        if(a[i]) continue;
        a[i]=a[tp]+i-tp+1;tp=i;
        if(a[i]<=N) a[a[i]]=i;
    }
    n=rd();m=rd();T=rd();
    int x,y;
    while(T--)
    {
        x=rd()+1;y=rd()+1;
        if(a[x]==y||a[y]==x) puts("Farmer John");
        else puts("Bessie");
    }
    return 0;
}
时间: 2024-08-07 04:22:16

bzoj 3298: [USACO 2011Open]cow checkers -- 数学的相关文章

3298: [USACO 2011Open]cow checkers

3298: [USACO 2011Open]cow checkers Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 65  Solved: 26[Submit][Status][Discuss] Description 一天,Besssie准备和FJ挑战奶牛跳棋游戏.这个游戏上在一个M*N(1<=M<=1,000,000;1<=N<=1,000,000)的棋盘上, 这个棋盘上在(x,y)(0<=x棋盘的左下角是(0,0)坐标,

【bzoj3298】[USACO 2011Open]cow checkers

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3298 博弈论经典结论题,我也没什么好说的.matrix67大佬比我想得深入的多:捡石子游戏. Wythoff 数表和一切的 Fibonacci 数列 代码: #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<ctime> #inc

[BZOJ 1652][USACO 06FEB]Treats for the Cows 题解(区间DP)

[BZOJ 1652][USACO 06FEB]Treats for the Cows Description FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving vast amounts of milk. FJ sells one treat per day and wants to maximize the money he receives over a given

BZOJ 1631==USACO 2007== POJ 3268 Cow Party奶牛派对

Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 19226   Accepted: 8775 Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of 

BZOJ 1629 Usaco Cow Acrobats

感觉就是一道贪心的题目,但是苦于没法下手.在瞎写了几组数据之后,猜了一个结论.A1-B1<A2-B2在看了看题解之后,发现自己好菜啊. 首先由两个前提条件 1. 两头牛调换顺序,并不会影响后面牛的计算. 2. 两头牛的顺序会影响答案. 所以 我们设 A,B为两个相邻的牛需要满足 Ax-By < Bx-Ay 的关系 才会使答案变小 #include <cstdio> #include <algorithm>   struct node{     long long  x,

BZOJ Usaco 1616 Cow Travelling

一开始还以为是BFS,但是发现卧槽写挫了.后来想了想如果去掉参数T,那么就是一个棋盘形DP了.那题目不过多了一个T,只需要DP加一维就可以了啊.=W= 还是我太菜了 1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4   5 using namespace std; 6   7 int n,m,t; 8 int Map[122][122]; 9 int Ex,Ey,Sx,Sy; 10 int

BZOJ 1706 usaco 2007 Nov relays 奶牛接力跑/POJ 3613 Cow Relays 倍增Floyd

题目大意:求恰好走k步从S到T的最短路. 思路:设f[p][i][j]为从i到j恰好走2^p步的最短路,DP方程十分简单:f[p][i][j] = min(f[p][i][j],f[p - 1][i][k] + f[p - 1][k][j]); 对总步数T进行二进制拆分,在T有1的位置上,假如这个位置为p,那么就用f[p][][]来更新答案g[][],最后得到的g[][]就是答案矩阵. 注意要离散化一下.. CODE: #include <cstdio> #include <cstrin

BZOJ 1641 USACO 2007 Nov. Cow Hurdles 奶牛跨栏

[题解] 弗洛伊德.更新距离的时候把$f[i][j]=min(f[i][j],f[i][k]+f[k][j])$改为$f[i][j]=min(f[i][j],max(f[i][k],f[k][j]))$. #include<cstdio> #include<algorithm> #include<cstring> #define N (400) #define rg register using namespace std; int n,m,t,a[N][N]; inl

[BZOJ] 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛

1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1312  Solved: 736[Submit][Status][Discuss] Description 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T