第十五届蓝桥杯javaA组 砍柴 (两种写法)详解
参考资料
原题链接砍柴 - 蓝桥云课 (lanqiao.cn)
区间质数搜索——埃拉托斯特尼筛法和欧拉筛法-CSDN博客
思路
质数筛 + 二分 + 博弈 + 状态机(只因bushi)
$$
状态转移方程 dp[i] = !dp[i-p]
$$
由原始题意可以看出
砍树长度限制为小于其长度的质数——暗示你使用质数筛
交替砍柴——状态机
最优策略——寻找小于当前长度的使自己必胜的质数 p——二分搜索加快速度
状态机定义 dp[i] 表示长度为 i 时先手的胜负态
代码 1 ——优化埃氏筛
import java.util.*;
public class Main {
static int t;
static int []wood;
static List<Integer> primes;
// 求2~n的所有质数 优化埃氏筛法
static void Sieve(int n){
primes = new ArrayList<>();
boolean []st = new boolean[n+1];
//添加2~根号n的所有质数,并标记<=n的所有合数
for(int i = 2;i*i<n;i++){
if(!st[i]){
primes.add(i);
for(int j = i*i;j<=n;j+=i){//根据当前质因子筛去其倍数
st[j] = true;
}
}
}
//添加根号n到n的所有质数
for(int i = (int)Math.sqrt(n)+1;i<=n;i++){
if(!st[i]){
primes.add(i);
}
}
}
// 求小于n的最大质数
static int maxPrimeLt(int n){
int l = 0,r = primes.size()-1;
while(l<r){
int mid = l + r + 1>>1;
if(primes.get(mid)>n){
r = mid - 1;
}
else{
l = mid;
}
}
return l;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
t = sc.nextInt();
wood = new int[t];
int maxLen = 0;
//接收t根木头并求得最大长度
for (int i = 0; i < t; i++) {
int val = sc.nextInt();
maxLen = Math.max(maxLen, val);
wood[i] = val;
}
// 求2~maxLen的所有质数
Sieve(maxLen);
//状态数组
boolean []dp = new boolean[maxLen+1];
//状态转移方程 dp[i] = !dp[i-p] p为小于i的最大质数 存在即可说明状态转移成功
for(int i = 2;i<=maxLen;i++){//枚举所有可能砍去的长度
for(int j = maxPrimeLt(i);j>=0;j--){//枚举状态转移的长度,即下一步的状态
if(!dp[i-primes.get(j)]){
dp [i] = true;
break; //存在即可说明状态转移成功
}
}
}
StringBuilder res = new StringBuilder();
for(int i = 0;i<t;i++){
if(dp[wood[i]])
res.append("1\n");
else
res.append("0\n");
}
System.out.println(res);
sc.close();
}
}
代码 2——欧拉筛
import java.util.*;
public class Main {
static int t;
static int []wood;
static List<Integer> primes;
// 求2~n的所有质数 优化埃氏筛法
static void Sieve(int n){
primes = new ArrayList<>();
boolean []st = new boolean[n+1];
for(int i = 2;i<=n;i++){
if(!st[i]){
primes.add(i);
}
for(Integer p:primes){
if(i*p>n)
break;
st[i*p] = true;
if(i%p==0){
break;
}
}
}
}
// 求小于n的最大质数
static int maxPrimeLt(int n){
int l = 0,r = primes.size()-1;
while(l<r){
int mid = l + r + 1>>1;
if(primes.get(mid)>n){
r = mid - 1;
}
else{
l = mid;
}
}
return l;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
t = sc.nextInt();
wood = new int[t];
int maxLen = 0;
//接收t根木头并求得最大长度
for (int i = 0; i < t; i++) {
int val = sc.nextInt();
maxLen = Math.max(maxLen, val);
wood[i] = val;
}
// 求2~maxLen的所有质数
Sieve(maxLen);
//状态数组
boolean []dp = new boolean[maxLen+1];
//状态转移方程 dp[i] = !dp[i-p] p为小于i的最大质数 存在即可说明状态转移成功
for(int i = 2;i<=maxLen;i++){//枚举所有可能砍去的长度
for(int j = maxPrimeLt(i);j>=0;j--){//枚举状态转移的长度,即下一步的状态
if(!dp[i-primes.get(j)]){
dp [i] = true;
break; //存在即可说明状态转移成功
}
}
}
StringBuilder res = new StringBuilder();
for(int i = 0;i<t;i++){
if(dp[wood[i]])
res.append("1\n");
else
res.append("0\n");
}
System.out.println(res);
sc.close();
}
}
第十五届蓝桥杯javaA组 砍柴 (两种写法)详解的更多相关文章
- 第九届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分数 题目描述 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多 ...
- 第六届蓝桥杯JavaA组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的. 有一天小明突然发现了有 ...
- 第七届蓝桥杯JavaA组国(决)赛部分真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.阶乘位数 阶乘位数 9的阶乘等于:362880 它的二进制表示为:1011000100110000000 这个数字共有19位. 请你计 ...
- 第七届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.煤球数量 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第 ...
- 第六届蓝桥杯JavaA组省赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.熊怪吃核桃 题目描述 森林里有一只熊怪,很爱吃核桃.不过它有个习惯,每次都把找到的核桃分成相等的两份,吃掉一份,留一份.如果不能等分, ...
- 第6届蓝桥杯javaA组第7题,牌型种数,一道简单的题带来的思考
题目: 小明被劫持到X赌城,被迫与其他3人玩牌. 一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张. 这时,小明脑子里突然冒出一个问题: 如果不考虑花色,只考虑点数,也不考虑自己得到 ...
- 第十届蓝桥杯JavaB组省赛真题
试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...
- 2018年第九届蓝桥杯B组题C++汇总解析-fishers
2018年第九届蓝桥杯B组题C++解析-fishers 题型 第一题:第几天 第二题:明码 第三题:乘积尾零 第四题:测试次数 第五题:快速排序 第六题:递增三元组 第七题:螺旋折线 第八题:日志统计 ...
- 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...
- 第十届蓝桥杯JavaB组总结
去年参加了第九届蓝桥杯C/C++B组,很捞,做了大概5道题,就好像就做对了2道结果填空题,编程题只做了一个(只通过了部分测试数据),最后拿了个省三,但是班上那些平时没有认真准备的都拿了省二 今年想好好 ...
随机推荐
- Fo-dicom通过C-store方式发送图片
1 using Dicom.Network; 2 using System; 3 using System.Collections.Generic; 4 using System.Linq; 5 us ...
- 第15章 流与IO
第15章 流与IO 15.1 .NET 流的架构 .NET 流的架构主要包含三个概念:** 后台存储 . 装饰器 以及 流适配器 **,如图所示: C7.0 核心技术指南 第7版.pdf - p655 ...
- 通过Ollama本地部署DeepSeek R1以及简单使用
本文介绍了在Windows环境下,通过Ollama来本地部署DeepSeek R1.该问包含了Ollama的下载.安装.安装目录迁移.大模型存储位置修改.下载DeepSeek以及通过Web UI来对话 ...
- IDEA打开多个项目
IDEA默认的情况下只能打开一个项目,即使添加了一个项目也会弹出一个窗口,将添加的项目显示在新的窗口中.通过下面操作可以,使IDEA打开过个项目. 1.1 打开项目结构 1.2 添加多个项目 点击&q ...
- List<Map<String, Object>> 排序
一.代码 public class Test { public static void main(String[] args) { Map<String, Object> map = ne ...
- 一文详解 MySQL 中的间隙锁
博客:https://www.emanjusaka.com 博客园:https://www.cnblogs.com/emanjusaka 公众号:emanjusaka的编程栈 by emanjusak ...
- 并发编程 - 线程同步(七)之互斥锁Monitor
通过前面对锁lock的基本使用以及注意事项的学习,相信大家对锁的同步机制有了大致了解,今天我们将继续学习--互斥锁Monitor. lock是C#语言中的关键字,是语法糖,lock语句最终会由C#编译 ...
- Dev Express WPF GridControl 数据导出到Excel
Dev Express WPF 给控件提供了公共的导出方法: Export to PDF Export to HTML Export to MHT Export to Text Export to C ...
- [JOISC 2023 Day3] Tourism 题解
大家好,我喜欢珂朵莉树,所以我用珂朵莉树 \(AC\) 了本题. 实际上,我们比较容易发现,这题实际上就是求 \([l,r]\) 中的所有点作为关键点时,虚树所压缩的所有点(实际上就是显现出来的点+在 ...
- vue打印浏览器页面功能的两种实现方法
目录 方法一:通过npm 安装插件 方法二:手动下载插件到本地 总结 推荐使用方法二 方法一:通过npm 安装插件 1,安装 npm install vue-print-nb --save 2,引入 ...