洛谷NOIP2002 普及组 选数 +NOIP1999普及组 回文数

2024-01-20 08:36

本文主要是介绍洛谷NOIP2002 普及组 选数 +NOIP1999普及组 回文数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

两道日常的练习题,废话不多说,直接上题上代码:

这道题目的难点在于怎样去根据一个不同的k值,通过代码来实现将所有符合题目要求的数字相加并且不重复的功能。下面请看代码,会有详细的讲解:

#include<iostream>
using namespace std;
int n,k;
const int N=1e2+10;
int a[N];
bool pd(int x){//质数的判断函数if(x==1) return false;//其实这里也不用特判1 但是因为题目说n可能为1 还是考虑一下//我也挺纳闷如果n为1的话 那么k<n应该是怎么回事if(x==2) return true;for(int i=2;i*i<=x;i++)if(x%i==0) return false;return true;
}
int ans;//最后输出的
void dfs(int cnt,int sum,int startx){
/*
代码的精华部分,用来计算所有不同情况的数字相加并进行ans的更新
*/if(cnt==k){//当此时sum中包含的加数个数达到k的时候if(pd(sum))//判断此时的sum是否符合质数条件++ans;return;}for(int i=startx;i<=n;i++){//这里的startx是搜索过程中 当前的sum即将加的值dfs(cnt+1,sum+a[i],i+1);//将cnt值 也就是加数的个数加1 同时sum加上对应下标的数字//并且将i加上1以便于计算从i+1所对应下标值相加的情况}return ;
}
int main(){cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];dfs(0,0,1);//分别代表加数个数 加数的和 以及每次搜索中下一个加的数字下标cout<<ans<<endl;return 0;
}

这道题目如果实在不能一次性看懂可以用测试的样例来根据代码进行模拟,有助于更好的理解代码。

接下来看第二道题目:

代码如下:

#include<cstdio>//
#include<cstring>//会用到strlen函数计算l
const int S=150;//因为一开始M最多有100位 每次add最多加一位 所以其实最多为130位,这里设置的大
int step,N,M,l;
char c[S],d[S];
bool pd(char c[]){for(int i=0;i<l;i++)if(c[i]!=c[l-i-1])return false;return true;
}
void add(char c[]){for(int i=0;i<l;i++){d[i]=c[l-1-i];}l+=2;//由于相加可能会进位使l的长度变大,所以这里将l增加2for(int i=0;i<l;i++){c[i]+=d[i];if(c[i]>=N){c[i]-=N;++c[i+1];} }while(!c[l-1]) l--;//如果l设置长了把他减回去
}
int main(){scanf("%d%s",&N,c);l=strlen(c);for(int i=0;i<l;i++){if(c[i]>='0' && c[i]<='9')  c[i]-='0';	else  c[i]=c[i]-'A'+10;//将字符作处理以便于像整数那样加减 }while(!pd(c)){++step;if(step>30) break;	add(c);} if(step<=30) printf("STEP=%d\n",step);else printf("Impossible!\n");return 0;   
}

这篇关于洛谷NOIP2002 普及组 选数 +NOIP1999普及组 回文数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/625409

相关文章

csu1328(近似回文串)

题意:求近似回文串的最大长度,串长度为1000。 解题思路:以某点为中心,向左右两边扩展,注意奇偶分开讨论,暴力解即可。时间复杂度O(n^2); 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>#include<string>#inclu

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

NYOJ 37 回文字符串(记忆化搜索)

OJ题目 : 戳这里~~ 描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 输入 第一行给出整数N(0<N<100) 接下来的N行,每行一个字符串,每个字符串长度不超过1000.

leetcode: 5. 最长回文子串

5. 最长回文子串 题目链接https://leetcode.cn/problems/longest-palindromic-substring/ 题目描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。 示例 2:

java常用算法之最长回文子串(Longest Palindromic Substring)

方法一:时间复杂度为O(n^3) public static String longestPalindrome1(String s) {int maxPalinLength = 0;String longestPalindrome = null;int length = s.length();// check all possible sub stringsfor (int i = 0; i

力扣-9. 回文数

文章目录 力扣题目代码工程方法1:方法2: 力扣题目 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数 是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而 123 不是。 示例 1: 输入:x = 121 输出:true 示例 2: 输入:x = -121 输出:false 解释:从左