您的位置:首页 > 娱乐 > 明星 > 重庆网络营销与网络广告_北京房价已经崩盘了_最近一周新闻_互联网运营自学课程

重庆网络营销与网络广告_北京房价已经崩盘了_最近一周新闻_互联网运营自学课程

2025/1/5 12:17:16 来源:https://blog.csdn.net/2302_78946634/article/details/143077204  浏览:    关键词:重庆网络营销与网络广告_北京房价已经崩盘了_最近一周新闻_互联网运营自学课程
重庆网络营销与网络广告_北京房价已经崩盘了_最近一周新闻_互联网运营自学课程

问题描述

小蓝和小乔正在森林里砍柴,它们有 TT 根长度分别为 n1,n2,⋯,nTn1​,n2​,⋯,nT​ 的木头。对于每个初始长度为 nn 的木头,小蓝和小乔准备进行交替砍柴,小蓝先出手。

每次砍柴时,若当前木头长度为 xx,需要砍下一截长度为 pp 的木头,然后换另一个人继续砍,其中 2≤p≤x2≤p≤x 且 pp 必须为质数。当轮到某一方时 x=1x=1 或 x=0x=0,它就没法继续砍柴,它就输了。它们会使用最优策略进行砍柴。请对每根木头判断是小蓝赢还是小乔赢,如果小蓝赢请输出 11(数字 11),如果小乔赢请输出 00(数字 00)。

输入格式

输入的第一行包含一个正整数 T,

接下来 T行,每行包含一个正整数,其中第 i 的整数为 ni​ (小i)​ 。

输出格式

输出 T行,每行包含一个整数,依次表示对于每一根木头的答案。

样例输入

3
1
2
6

样例输出

0
1
1

在这个问题中,我们的目标是判断一个整数 (i) 是否可以被表示为多个质数的和。我们使用动态规划(DP)来实现这个目标。 

代码示例(Java)

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取测试用例数量int t = sc.nextInt();int[] a = new int[t]; // 存储每个测试用例的数值int maxLength = 0; // 用于记录输入中最大的值// 读取输入的数值for(int i = 0; i < t; i++){a[i] = sc.nextInt(); // 读取每个数if(a[i] > maxLength){ // 更新最大的数值maxLength = a[i];}}// 获取从 1 到 maxLength 的所有质数List<Integer> primes = getPrimes(maxLength);// 创建一个动态规划数组,dp[i] 表示数字 i 是否可以被表示为一个质数和的结果boolean[] dp = new boolean[maxLength + 1];dp[0] = false; // 0 不能表示为质数和dp[1] = false; // 1 不能表示为质数和// 填充 dp 数组for(int i = 2; i <= maxLength; i++){for(int prime : primes){if(prime > i) {break; // 如果质数大于当前数 i,则无需继续}if(!dp[i - prime]) {// 如果 i - prime 不能表示为质数和,那么 i 可以被表示为 prime + (i - prime)dp[i] = true;break; // 找到一个质数后,可以直接跳出内层循环}}}// 输出每个测试用例的结果for(int b : a){System.out.println(dp[b] ? 1 : 0); // 如果可以表示为质数和,输出 1,否则输出 0}}// 获取从 1 到 maxLength 的所有质数private static List<Integer> getPrimes(int maxLength) {List<Integer> primes = new ArrayList<>();boolean[] isPrime = new boolean[maxLength + 1];// 初始化 isPrime 数组,默认所有数都是质数for(int i = 2; i <= maxLength; i++){isPrime[i] = true;}// 使用埃拉托斯特尼筛法找出所有质数for(int i = 2; i * i <= maxLength; i++){if(isPrime[i]) {// 将 i 的倍数标记为非质数for(int j = i * i; j <= maxLength; j += i){isPrime[j] = false;}}}// 将所有质数添加到列表中for(int i = 2; i <= maxLength; i++){if(isPrime[i]){primes.add(i);}}return primes; // 返回质数列表}
}

思路

质数生成

    使用埃拉托斯特尼筛法(Sieve of Eratosthenes)生成从 1 到 maxLength 的所有质数。这是一种高效的质数筛选方法。

动态规划

    使用动态规划数组 dp 来判断每个数字是否可以表示为质数的和。
    dp[i] 表示数字 i 是否可以表示为一个或多个质数的和。
    初始化 dp[0] 和 dp[1] 为 false(0和1无法表示为质数和)。
    对于每个数字 i,遍历所有质数 prime,如果 i - prime 的 dp 值为 false,则说明 i 可以表示为 prime + (i - prime)。可以用一个质数和一个不能表示为质数和的数的和来表示。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com