蓝桥杯

蓝桥杯题目练习(拦截导弹)

ε祈祈猫儿з 提交于 2020-02-19 12:09:35
算法训练VIP 拦截导弹 原题链接: 拦截导弹 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹 拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的 导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。 输入 一行,为导弹依次飞来的高度 输出 两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数 样例输入 389 207 155 300 299 170 158 65 样例输出 6 2 思考: 最多能拦截的导弹就是高度的最长下降子序列; 要拦截所有导弹最少要配备的系统数就是高度的最长上升子序列 # include <iostream> using namespace std ; int height [ 100 ] ; int dp_down [ 100 ] ; //高度下降序列依次的长度 int dp_up [ 100 ] ; //高度上升序列依次的长度 int mycount = 1 ; int down = 0 , up = 0 ; int main ( ) { while ( cin

蓝桥杯 排他平方数

ぐ巨炮叔叔 提交于 2020-02-17 11:06:40
标准开头 菜 勿喷 即使题目比较简单 但是代码肯定有许多不足 还可以简化 重要的是其中判断i和i*i各位数是否有重复和i的各位数是否重复的方法 隐隐感觉会有更高效的方法 过后想出来会更新 # include <stdio.h> # include <string.h> int a [ 10 ] ; //装一个数的各位数 int b [ 10 ] ; //装平方数的各个位数 void f ( long long int n ) { //printf("%lld\n",n); while ( n ) { a [ n % 10 ] = 1 ; n / = 10 ; } } void ff ( long long int n ) { //printf("%lld\n",n); while ( n ) { b [ n % 10 ] = 1 ; n / = 10 ; } } int main ( ) { for ( long long int i = 100000 ; i < 1000000 ; i ++ ) { memset ( a , 0 , sizeof ( a ) ) ; memset ( b , 0 , sizeof ( b ) ) ; //两个数组每次都初始化 f ( i ) ; ff ( i * i ) ; int sum = 0 , flag = 1 ; for ( int j

蓝桥杯之字符串压缩

北城余情 提交于 2020-02-17 05:58:44
问题描述 编写一个程序,输入一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:    (1) 如果该字符是空格,则保留该字符; (2) 如果该字符是第一次出现或第三次出现或第六次出现,则保留该字符; (3) 否则,删除该字符。   例如,若用户输入“occurrence”,经过压缩后,字符c的第二次出现被删除,第一和第三次出现仍保留;字符r和e的第二次出现均被删除,因此最后的结果为:“ocurenc”。   输入格式:输入只有一行,即原始字符串。   输出格式:输出只有一行,即经过压缩以后的字符串。 输入输出样例 样例输入 occurrence 样例输出 ocurenc public class Main { public static void main ( String [ ] args ) { //Scanner in=new Scanner(System.in); //String s=in.nextLine(); String s = "occurrence" ; char [ ] ch = s . toCharArray ( ) ; int count [ ] = new int [ ch . length ] ; //记录某个字符是第几次出现 for ( int i = 0 ; i < ch . length ; i ++ ) { for ( int

蓝桥杯:字符串

落花浮王杯 提交于 2020-02-16 11:53:49
: 题目链接 # include <bits/stdc++.h> using namespace std ; const int MAXN = 2000 + 117 ; char s [ MAXN ] ; int len ; int a [ MAXN ] ; int fact [ MAXN ] ; int M ; int num , now ; void sub ( int mul , int order ) { //这里的操作是把a[i]删除 int sum = fact [ order ] ; sum = sum * mul % M ; now = ( ( now - sum ) % M + M ) % M ; //减去sum在加M是为了防止负数出现 } void add ( int mul , int order ) { int sum = fact [ order ] ; sum = sum * mul % M ; now = ( now + sum ) % M ; } void init ( ) { //预处理幂次 scanf ( "%s" , s ) ; scanf ( "%d" , & M ) ; fact [ 0 ] = 1 ; for ( int i = 1 ; i < MAXN ; i ++ ) fact [ i ] = fact [ i - 1 ] * 26

蓝桥杯python组如何准备

孤街醉人 提交于 2020-02-16 03:50:09
在蓝桥杯的程序设计比赛里新增加了python组,这是一个全新的组别,目前蓝桥杯官网已经开通了python的练习平台,链接http://dasai.lanqiao.cn/ 如何准备2020年蓝桥杯python程序设计呢,我分为四个部分讲解,了解这四个部分,将有助于备战此次比赛 一、python基本的语法 学到面向对象就差不多了,不需要太深入学习面向对象后面的内容。因为这是程序设计比赛,很少会涉及到python的高阶知识,因此我建议学完基本的面向对象即可,后面的不必深入。当然,python在人工智能等领域是有很大用武之地的,因此想走这些方向的同学可以深入的学下去。 二、掌握python标准库 蓝桥杯是不支持第三方库的,后面注意事项里面我会讲到,但是python的标准库就已经琳琅满目了,学好python标准库,将是一个事半功倍的过程。 三、找一本大纲开始刷题和学习 推荐《算法竞赛入门经典》,虽然是c++的,但是非常适合作为大纲,题目也完全符合蓝桥杯难度,你需要做的,就是学会这些思想,然后用python实现。 四、注意事项 1.不支持第三方库 蓝桥杯python组,不支持第三方库,仅能使用python的标准库,这就需要知道python的常用标准库有哪些,哪些在算法比赛中比较常见,学会一些常用的标准库,对于我们解题是十分有帮助的,方便且快速。 对于蓝桥杯中可能用到python的标准库

蓝桥杯python 基础练习4 数列特征

孤人 提交于 2020-02-16 02:56:46
问题描述 给出n个数,找出这n个数的最大值,最小值,和。 输入格式 第一行为整数n,表示数的个数。 第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。 输出格式 输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。 样例输入 5 1 3 -2 4 5 样例输出 5 -2 11 知识点:map(int,input().split())函数可以使用空格多次输入值 思路:可以将list与上述的知识点相结合,运用max(),min(),sum()函数来分别求取最大,最小,和 while True : try : n = int ( input ( ) ) A = list ( map ( int , input ( ) . split ( ) ) ) print ( max ( A ) ) print ( min ( A ) ) print ( sum ( A ) ) except : break 来源: CSDN 作者: 博创_馒头 链接: https://blog.csdn.net/qq_45804375/article/details/104310983

蓝桥杯 ADV-162 算法提高 题目1 最大最小值

坚强是说给别人听的谎言 提交于 2020-02-15 07:01:41
算法提高 题目1 最大最小值 时间限制:1.0s 内存限制:1.0GB 问题描述   给定 N 个整数,请你找出这 N 个数中最大的那个和最小的那个。 输入格式   第一行包含一个正整数 N 。(1 ≤ N ≤ 10000)。   第二行为 N 个用空格隔开的整数,每个数的绝对值不超过 1000000。 输出格式   输出仅一行,包含两个整数 x , y , x 表示 N 个数中的最大值, y 表示 N 个数中的最小值。 x , y 之间用一个空格隔开。 样例输入 4 2 0 1 2 样例输出 2 0 #include <stdio.h> int main() { int N; int arr[10005] = { 0 }; scanf("%d", &N); for (int i = 0; i < N; ++i) scanf("%d", &arr[i]); int max = arr[0], min = arr[0]; for (int i = 1; i < N; ++i) { if (max < arr[i]) max = arr[i]; if (min > arr[i]) min = arr[i]; } printf("%d %d", max, min); return 0; } 来源: CSDN 作者: liulizhi1996 链接: https://blog.csdn

蓝桥杯python 基础练习5 查找整数

空扰寡人 提交于 2020-02-15 05:28:46
问题描述 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。 输入格式 第一行包含一个整数n。 第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。 第三行包含一个整数a,为待查找的数。 输出格式 如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。 样例输入 6 1 9 4 8 3 9 9 样例输出 2 思路:与上一题思路相同,将数字输入到列表中。在运用循环输出寻找的数的下标,如果没有就输出-1. while True : try : n = int ( input ( ) ) lis = list ( map ( int , input ( ) . split ( ) ) ) num = int ( input ( ) ) if num not in lis : print ( - 1 ) for i in range ( n ) : if lis [ i ] == num : print ( i + 1 ) break except : break 来源: CSDN 作者: 博创_馒头 链接: https://blog.csdn.net/qq_45804375/article/details/104311059

蓝桥杯基础练习

瘦欲@ 提交于 2020-02-14 17:51:54
(1)序列排序 问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200 输入格式 第一行为一个整数n。 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。 输出格式 输出一行,按从小到大的顺序输出排序后的数列。 样例输入 5 8 3 6 4 9 样例输出 3 4 6 8 9 代码 # include <stdio.h> int s ; int main ( ) { int n , i ; scanf ( "%d" , & n ) ; int a [ 201 ] ; for ( i = 0 ; i < n ; i ++ ) { scanf ( "%d" , & a [ i ] ) ; } int j ; for ( i = 0 ; i < n ; i ++ ) { for ( j = i + 1 ; j < n ; j ++ ) { if ( a [ i ] > a [ j ] ) { s = a [ j ] ; a [ j ] = a [ i ] ; a [ i ] = s ; } } } for ( i = 0 ; i < n ; i ++ ) { printf ( "%d " , a [ i ] ) ; } return 0 ; } (2)进制转换 十六进制转十进制 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串

蓝桥杯——奇妙的数字

纵饮孤独 提交于 2020-02-14 01:53:23
小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。 你能猜出这个数字是多少吗? 请填写该数字,不要填写任何多余的内容。 答案:69 思路:循环,将平方结果和立方结果中的每个数放入数组中,然后判断该数组中0-9的数字是否存在,即是否用且用了一次 # include <iostream> # include <stdio.h> using namespace std ; bool fun ( int x ) { int i ; int a1 [ 10 ] = { 0 } ; //初始化数组a1 int a , b ; a = x * x ; //平方 b = x * x * x ; //立方 while ( a ) { a1 [ a % 10 ] ++ ; //将a的每个数字存放在数组a1中 a / = 10 ; } while ( b ) { a1 [ b % 10 ] ++ ; //将b的每个数字存放在数组a1中 b / = 10 ; } for ( i = 0 ; i <= 9 ; i ++ ) { if ( a1 [ i ] == 0 ) //判断1-9数字是否都有 return false ; } return true ; } int main ( ) { int i ; for ( i = 1 ; i < 300 ; i ++ ) {