ollie

杭电OJ 1156(C++)

那年仲夏 提交于 2020-02-25 21:09:53
#include <iostream> #include <algorithm> #include <vector> using namespace std; const int MAXN = 200002; int l[MAXN], r[MAXN]; //垂线左侧的点,垂线右侧的点 int y[MAXN]; //y轴坐标 int n, w; struct Line //垂直于x轴的直线 { int x, y; friend bool operator < (Line a, Line b) { return a.x < b.x; } }line[MAXN]; int lowbit(int x) { return x & -x; } void add(int t[], int x, int v) { while (x <= w) { t[x] += v; x += lowbit(x); } } int sum(int t[], int x) { int res = 0; while (x > 0) { res += t[x]; x -= lowbit(x); } return res; } int main(void) { while (cin >> n) { if (n == 0) break; for (int i = 0; i < n; i++) { cin >> line[i

UVA-10404 Bachet's Game

我的未来我决定 提交于 2020-01-25 14:45:12
这是一道很经典的必胜策略题目 原题:Stan和Ollie在玩一个游戏,桌子上有n(n <= 1e6)枚硬币,同时给出k(k <= 10)个互不相同的正整数数a[1], a[2], a[3], ..., a[k],Stan跟Ollie轮流拿桌子上的硬币,但每次只能拿这k个数中的一个数的枚数(即设这k个数构成一个集合,Stan跟Ollie只能从这集合中挑出一个数来作为他本回合拿走硬币的数量),每一局游戏都是Stan先拿,这k个数中必有1,所以每一局游戏必然能分出胜负 现在定你n, k, 以及后边的k个数,假设他们两个每一步都做出了最佳策略,那么请问最终会是谁获胜? 输入: 有多行,每行第一个数是n,第二个数是k,然后后边接着k个数 输出: 对于每行都要输出一个结果,即输出"Stan wins"或者"Ollie wins" 样例输入: 20 3 1 3 8 21 3 1 3 8 22 3 1 3 8 23 3 1 3 8 1000000 10 1 23 38 11 7 5 4 8 3 13 999996 10 1 23 38 11 7 5 4 8 3 13 样例输出: Stan wins Stan wins Ollie wins Stan wins Stan wins Ollie wins 原题链接(英文): https://vjudge.net/problem/UVA-10404