T1 [JZOJ2642] 游戏

题目描述

  Alice和Bob在玩一个游戏,游戏是在一个N*N的矩阵上进行的,每个格子上都有一个正整数。当轮到Alice/Bob时,他/她可以选择最后一列或最后一行,并将其删除,但必须保证选择的这一行或这一列所有数的和为偶数。如果他/她不能删除最后一行或最后一列,那么他/她就输了。两人都用最优策略来玩游戏,Alice先手,问Alice是否可以必胜?

分析

  这个说辞...一看就知道是博弈论

  众所周知,博弈论有两个重要结论:

  1.一个状态是必败状态当且仅当它任意后继都是必胜状态

  2.一个状态是必胜状态当且仅当它存在后继是必败状态

  于是设 $f[i][j]$ 为矩阵为 $i$ 行 $j$ 列时该回合操作方的状态($1$ 为必胜,$0$ 为必败),显然 $f[1][1]=1$

  同时需要将 $f[1][i]$ 和 $f[i][1]$ 初始化,还要记录所有横轴和纵轴的前缀和

  然后分别讨论删除最后一行和最后一列时的后继状态,若该行或该列无法被删除,则该后继视为必胜

  考场上写这题的时候已经不早了,感觉有点慌,幸好最后过了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
#define N 1005int T, n;
int g[N][N], f[N][N], p1[N][N], p2[N][N];int main() {scanf("%d", &T);while (T--) {scanf("%d", &n);for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++) {scanf("%d", &g[i][j]);p1[i][j] = p1[i][j - 1] + g[i][j];p2[i][j] = p2[i - 1][j] + g[i][j];}f[1][1] = 1;for (int i = 2; i <= n; i++) {int t1, t2;if (p1[1][i] % 2) t1 = 1;else t1 = 0;if (p2[1][i] % 2) t2 = 1;else if (f[1][i - 1]) t2 = 1;else t2 = 0;if (t1 && t2) f[1][i] = 0;else f[1][i] = 1;}for (int i = 2; i <= n; i++) {int t1, t2;if (p2[i][1] % 2) t2 = 1;else t2 = 0;if (p2[i][1] % 2) t1 = 1;else if (f[i - 1][1]) t1 = 1;else t1 = 0;if (t1 && t2) f[1][i] = 0;else f[i][1] = 1;}for (int i = 2; i <= n; i++)for (int j = 2; j <= n; j++) {int t1, t2;if (p1[i][j] % 2) t1 = 1;else if (f[i - 1][j]) t1 = 1;else t1 = 0;if (p2[i][j] % 2) t2 = 1;else if (f[i][j - 1]) t2 = 1;else t2 = 0;if (t1 && t2) f[i][j] = 0;else f[i][j] = 1;}if (f[n][n]) printf("W\n");else printf("L\n");}return 0;
}

View Code

T2 [JZOJ2643] 六边形

题目描述

  棋盘是由许多个六边形构成的,共有5种不同的六边形编号为1到5,棋盘的生成规则如下:

  1.从中心的一个六边形开始,逆时针向外生成一个个六边形。

  2.对于刚生成的一个六边形,我们要确定它的种类,它的种类必须满足与已生成的相邻的六边形不同。

  3.如果有多个种类可以选,我们选择出现次数最少的种类。

  4.情况3下还有多个种类可以选,我们选择数字编号最小的。

  现在要你求第N个生成的六边形的编号?

  前14个六边形生成图如下:

分析

  这是个纯模拟,感觉没有什么要分析的

  主要就是要多注意细节,考场上少写了一句代码,直接掉到了 $45.5$ 分

  而且每次一写模拟就写得贼慢

//考场上写得有点繁琐
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 10005int T, n, c = 2, now = 8, s, e, ok, g1, g2;
int q[25], g[N], book[6], sum[6];int main() {scanf("%d", &T);for (int i = 1; i <= T; i++) {scanf("%d", q + i);n = max(n, q[i]);}g[1] = 1; g[2] = 2; g[3] = 3;g[4] = 4; g[5] = 5; g[6] = 2; g[7] = 3;sum[1] = sum[4] = sum[5] = 1;sum[2] = sum[3] = 2; sum[0] = inf;s = 2; e = 7;while (++c) {for (int i = 1; i <= 6; i++) {for (int j = 1; j < c; j++) {memset(book, 0, sizeof book);int minsum = inf;if (j != c - 1) {if (now == e + 1) {book[g[s]] = book[g[e]] = 1;for (int k = 1; k <= 5; k++)if (!book[k])minsum = min(minsum, sum[k]);for (int k = 1; k <= 5; k++)if (!book[k] && sum[k] == minsum) {g[now++] = k; sum[k]++; break;}g1 = s; g2 = s + 1; s = e + 1;}else {book[g[g1]] = book[g[g2]] = book[g[now - 1]] = 1;for (int k = 1; k <= 5; k++)if (!book[k])minsum = min(minsum, sum[k]);for (int k = 1; k <= 5; k++)if (!book[k] && sum[k] == minsum) {g[now++] = k; sum[k]++; break;}g1++; g2++;}}else {if (i == 6) e = now, book[g[s]] = 1;book[g[g1]] = book[g[now - 1]] = 1;for (int k = 1; k <= 5; k++)if (!book[k])minsum = min(minsum, sum[k]);for (int k = 1; k <= 5; k++)if (!book[k] && sum[k] == minsum) {g[now++] = k; sum[k]++; break;}}if (now > n) {ok = 1; break;}}if (ok) break;}if (ok) break;}for (int i = 1; i <= T; i++)printf("%d\n", g[q[i]]);return 0;
}

View Code

T3 [JZOJ2644] 数列

题目描述

  给你一个长度为N的正整数序列,如果一个连续的子序列,子序列的和能够被K整除,那么就视此子序列合法,求原序列包括多少个合法的连续子序列?

  对于一个长度为8的序列,K=4的情况:2, 1, 2, 1, 1, 2, 1, 2 。它的答案为6,子序列是位置1->位置8,2->4,2->7,3->5,4->6,5->7。

分析

  看到题目就先写了前缀和枚举区间 $O(n^2)$ 暴力 $30 \, pts$

  当时看了半天觉得这是最可做的一题,结果看了数据范围还是没想出来 $O(n \, log \, n)$ 做法

  结果考完试下午看了下大家的讨论,发现正解是 $O(k)$

  具体就是把每个前缀和按 $k$ 取模,记录每个余数出现的次数 $sum$

  显然,前缀和所得余数相同的的两项之间的区间和,一定能被 $k$ 整除

  所以在余数相同的项中,我们可以任意挑选两项组成一个合法区间

  因此答案为 $\sum\limits_{i=0}^{k-1} \binom{sum[i]}{2}$

  要注意,第 $0$ 项的前缀和余数视为 $0$

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
#define ll long long
#define N 50005
#define K 1000005int T, n, k, x;
int pre[N], sum[K];
ll ans, c[K];int main() {c[2] = 1;for (int i = 3; i <= N; i++)c[i] = c[i - 1] + i - 1;scanf("%d", &T);while (T--) {ans = 0;scanf("%d%d", &k, &n);for (int i = 1; i <= k; i++) sum[i] = 0;sum[0] = 1;for (int i = 1; i <= n; i++) {scanf("%d", &x);pre[i] = (pre[i - 1] + x) % k;sum[pre[i]]++;}for (int i = 0; i < k; i++)ans += c[sum[i]];printf("%lld\n", ans);}return 0;
}

View Code

转载于:https://www.cnblogs.com/Pedesis/p/11284483.html

2019-08-01 纪中NOIP模拟赛B组相关推荐

  1. 2019-08-12 纪中NOIP模拟赛B组

    T1 [JZOJ4879] 少女觉 题目描述 "在幽暗的地灵殿中,居住着一位少女,名为古明地觉." "据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力- ...

  2. 【题解】少女觉 (2019.08.12纪中【NOIP提高组】模拟 B 组T1)贪心

    题目来源:中山纪念中学 题目描述: 在幽暗的地灵殿中,居住着一位少女,名为古明地觉. 据说,从来没有人敢踏入过那座地灵殿,因为人们恐惧于觉一族拥有的能力--读心. 掌控人心者,可控天下. 咳咳. 人的 ...

  3. 纪中集训2020.01.13【NOIP普及组】模拟赛C组总结————My First Time Write Summary

    纪中集训2020.01.13[NOIP普及组]模拟赛C组总结 题目编号 标题 0 [NOIP普及组模拟]取值( numbers.pas/cpp) 1 [NOIP普及组模拟]数对(pairs.pas/c ...

  4. 纪中集训2020.01.16【NOIP普及组】模拟赛C组总结+【0.Matrix】分析

    纪中集训2020.01.16[NOIP普及组]模拟赛C组总结+[0.Matrix]分析 题目: 0.matrix 1.product 2.binary 3.value 巨佬估分:100+100+40+ ...

  5. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  6. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  7. JZOJ(中山纪念中学) 2018.02.02【NOIP普及组】模拟赛D组

    本次题目:2018.02.02[NOIP普及组]模拟赛D组 第一题 题目:第一题 公牛数字 题意: 求题目给出两个数字的乘积 分析: 这题明显只是考察学生的高精可我居然没做对,只要多练习几次,即可AC ...

  8. NOIP 模拟赛 长寿花 题解

    NOIP 模拟赛 长寿花 题解 要放 \(n\) 层物品,第 \(i\) 层有 \(a_i\) 个位置放物品,物品有 \(m\) 中颜色,有约束条件: 同一层两个相邻物品颜色不能相同. 相邻两层颜色集 ...

  9. 辣鸡(ljh) NOIP模拟赛 模拟 平面几何 数论 化学相关(雾)

    [题目描述] 辣鸡ljhNOI之后就退役了,然后就滚去学文化课了. 然而在上化学课的时候,数学和化学都不好的ljh却被一道简单题难住了,受到了大佬的嘲笑. 题目描述是这样的:在一个二维平面上有一层水分 ...

最新文章

  1. java常用类型转换
  2. 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )
  3. Lesson 13.5 Xavier方法与kaiming方法(HE初始化)
  4. matlab参数识别,教程:matlab参数识别(包括微分方程和simulink)
  5. idea spring helloworld
  6. C++11正则表达式例子集合
  7. 数据结构(二)---单链表的实现---java版
  8. 中国船级社船舶设计审核云平台
  9. 安装工程图形算量离我们还多远
  10. Kubernetes 入门教程
  11. 雷军谈小米10的3999元起售价:定价比华为苹果厚道
  12. vs Obsolete标识符
  13. L1-020. 帅到没朋友-PAT团体程序设计天梯赛GPLT
  14. python中变量通过变量名访问_如何在python中访问给定变量的名称?
  15. Python基础之文件读写和列表字典使用 ——《侠客行》文本分析
  16. html css 美化模板,通用css样式,全局css样式,css样式模板,
  17. Go语言之return语句的几种用法
  18. HDU 4357 字符交换位置无数次变成另一个字符串-YY-(神题
  19. 李宏毅2020机器学习深度学习 笔记1(理论上持续更新中)
  20. 【线上直播】人机多轮对话的方法综述

热门文章

  1. Nginx:Nginx limit_req limit_conn限速
  2. [bzoj 2726] 任务安排 (斜率优化 线性dp)
  3. Squid 访问控制配置
  4. 什么时候用synchronized
  5. 【java并发编程艺术学习】(一)初衷、感想与笔记目录
  6. Android系统启动系列----init进程
  7. Word中摘要和正文同时分栏后,正文跑到下一页,怎么办?或Word分栏后第一页明明有空位后面的文字却自动跳到第二页了,怎么办?...
  8. iis下php 500错误
  9. ASP.NET AntiXSS的作用
  10. java concurrent包介绍及使用