蓝桥杯必考真题

问题 A

时间限制: 1s 内存限制: 256MB 提交: 442 解决: 198

题目描述

给定 n, m ,问是否存在两个不同的数 x, y 使得 1 ≤ x < y ≤ m 且 n mod x = n mod y 。

输入

输入包含多组独立的询问。

第一行包含一个整数 T 表示询问的组数。

接下来 T 行每行包含两个整数 n, m,用一个空格分隔,表示一组询问。

输出

输出 T 行,每行依次对应一组询问的结果。如果存在,输出单词 Yes;如果不存在,输出单词 No。

样例输入

3
1 2
5 2
999 99

样例输出

No
No
Yes

提示

对于 20% 的评测用例,T ≤ 100 ,n, m ≤ 1000;

对于 50% 的评测用例,T ≤ 10000 ,n, m ≤ 105;

对于所有评测用例,1 ≤ T ≤ 105 ,1 ≤ n ≤ 109 ,2 ≤ m ≤ 109。 

本试题适用于用Python代码来完成,如用c/c++/java代码建议转到:蓝桥杯2022年第十三届决赛真题-取模(C/C++/Java组) - C语言网链接

先判断大的数可能更有用

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
import java.io.*;
import java.math.*;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.*;
import java.io.*;
import java.math.*;
public class Main {
//int 2147483647   10
    //-2147483648
    //9223372036854775807   19
    //-9223372036854775808
    //1.7976931348623157E308  308
    //4.9E-324
    static int m;
    static long mm;
    static int n;
    static long nn;
    static ArrayList al = new ArrayList<>();
    static Stack st = new Stack<>();
    static Queue q = new LinkedList<>();
    static HashMap hm = new HashMap<>();
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    static Scanner sc = new Scanner(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {

        int k= Integer.valueOf(br.readLine());
        //System.out.println(k);
while(k-->0){
    String[] a= br.readLine().split(" ");
//    System.out.println(a[0]);
//    System.out.println(a[1]);
n=Integer.valueOf(a[0]);
m= Integer.valueOf(a[1]);
int fla=0;

        for (int i = 1; i <=m; i++) {
            for(int j=1;j

问题 B

时间限制: 1s 内存限制: 256MB 提交: 86 解决: 46

题目描述

小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。

为了简化问题,变量的类型只有以下三种:

int:整型变量,一个 int 型变量占用 4 Byte 的内存空间。

long:长整型变量,一个 long 型变量占用 8 Byte 的内存空间。

String:字符串变量,占用空间和字符串长度有关,设字符串长度为 L,则字符串占用 L Byte 的内存空间,如果字符串长度为 0 则占用 0 Byte 的内存空间。

定义变量的语句只有两种形式,第一种形式为:

type var1=value1,var2=value2…;

定义了若干个 type 类型变量 var1、var2、…,并且用 value1、value2、…初始化。

多个变量之间用’,’ 分隔,语句以’;’ 结尾,type 可能是 int、long 或 String。例如 int a=1,b=5,c=6; 占用空间为 12 Byte;long a=1,b=5; 占用空间为 16 Byte;String s1=””,s2=”hello”,s3=”world”; 占用空间为 10 Byte。

第二种形式为:

type[] arr1=new type[size1],arr2=new type[size2]…;

定义了若干 type 类型的一维数组变量 arr1、arr2…,且数组的大小为 size1、size2…,多个变量之间用’,’ 进行分隔,语句以’;’ 结尾,type 只可能是 int 或 long。例如 int[] a1=new int[10]; 占用的内存空间为 40 Byte;long[] a1=new long[10],a2=new long[10]; 占用的内存空间为 160 Byte。

已知小蓝有 T 条定义变量的语句,请你帮他统计下一共占用了多少内存空间。结果的表示方式为:aGBbMBcKBdB,其中 a、b、c、d 为统计的结果,GB、MB、KB、B 为单位。优先用大的单位来表示,1GB=1024MB,1MB=1024KB,1KB=1024B,其中 B 表示 Byte。如果 a、b、c、d 中的某几个数字为 0,那么不必输出这几个数字及其单位。题目保证一行中只有一句定义变量的语句,且每条语句都满足题干中描述的定义格式,所有的变量名都是合法的且均不重复。题目中的数据很规整,和上述给出的例子类似,除了类型后面有一个空格,以及定义数组时 new 后面的一个空格之外,不会出现多余的空格。

输入

输入的第一行包含一个整数 T ,表示有 T 句变量定义的语句。

接下来 T 行,每行包含一句变量定义语句。

输出

输出一行包含一个字符串,表示所有语句所占用空间的总大小。

样例输入

1
long[] nums=new long[131072];

样例输出

1MB

提示

样例 1,占用的空间为 131072 × 8 = 1048576 B,换算过后正好是 1MB,其它三个单位 GB、KB、B 前面的数字都为 0 ,所以不用输出。 

样例 2,占用的空间为 4 × 2 + 8 × 2 + 10 + 8 × 100000 × 2 B,换算后是 1MB538KB546B。

对于所有评测用例,1 ≤ T ≤ 10,每条变量定义语句的长度不会超过 1000 。所有的变量名称长度不会超过 10,且都由小写字母和数字组成。对于整型变量,初始化的值均是在其表示范围内的十进制整数,初始化的值不会是变量。对于 String 类型的变量,初始化的内容长度不会超过 50,且内容仅包含小写字母和数字,初始化的值不会是变量。对于数组类型变量,数组的长度为一个整数,范围为:[0, 230],数组的长度不会是变量。T 条语句定义的变量所占的内存空间总大小不会超过 1 GB,且大于 0 B。

本试题适用于用Python代码来完成,如用c/c++/java代码建议转到:https://www.dotcpp.com/oj/problem2702.html链接

简单的模拟题主要是阅读理解以及写代码的速度

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Main {
    static Scanner sc = new Scanner(System.in);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws Exception {
        String[] unit = {"", "K", "M", "G"};
    long count = 0;
        for (int T = Integer.parseInt(br.readLine()); T-- > 0; ) {
            String line = br.readLine();
            if (line.startsWith("String")) {
                for (int flag = 0, i = 0, j = 0; i < line.length(); i++) {
                    if (line.charAt(i) == '"') {
count+=flag*(i-j-1);
                    flag^=1;
j=i;
                    }
                }
            } else{
               long buffer=0;
               if(line.charAt(3)=='['||line.charAt(4)=='['){
                   for(int i=6,j=0;i=0;i--){
    if(count>>(i*10)>0){
        System.out.print((count>>(i*10))+unit[i]+'B');
count&=(1<<(i*10))-1;

    }
}



    }


}
#include
#include
#include
#include
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair PII;

const int N =110;

int INT(){
	string s;
	getline(cin,s);
	int num=0;
	for(int i=0;i>s;
		if(s.substr(0,3)=="int"&&s[3]!='[')
			res+=INT();
		else if(s.substr(0,4)=="long"&&s[4]!='[')
			res+=LLong();
		else if(s.substr(0,6)=="String"&&s[6]!='[')
			res+=Sstring();
		else{
			if(s.substr(0,3)=="int")
			res+=New()*4;
			else if(s.substr(0,4)=="long")
			res+=New()*8;
			else 
			res+=New();
		}	
	}
	print();
	return
	0;
} 
/*
4
int a,b;
long a,b;
String s="1234567890";
long[] a=new long[100000],b=new long[100000];
*/

问题 C

时间限制: 1s 内存限制: 256MB 提交: 94 解决: 84

题目描述

小蓝有一个长度为 n 的数组 A = (a1, a2, · · · , an),数组的子数组被定义为从原数组中选出连续的一个或多个元素组成的数组。数组的最大公约数指的是数组中所有元素的最大公约数。如果最多更改数组中的一个元素之后,数组的最大公约数为 g,那么称 g 为这个数组的近似 GCD。一个数组的近似 GCD 可能有多种取值。

具体的,判断 g 是否为一个子数组的近似 GCD 如下:

1. 如果这个子数组的最大公约数就是 g,那么说明 g 是其近似 GCD。

2. 在修改这个子数组中的一个元素之后(可以改成想要的任何值),子数组的最大公约数为 g,那么说明 g 是这个子数组的近似 GCD。

小蓝想知道,数组 A 有多少个长度大于等于 2 的子数组满足近似 GCD 的值为 g。

输入

输入的第一行包含两个整数 n, g,用一个空格分隔,分别表示数组 A 的长度和 g 的值。

第二行包含 n 个整数 a1, a2, · · · , an,相邻两个整数之间用一个空格分隔。

输出

输出一行包含一个整数表示数组 A 有多少个长度大于等于 2 的子数组的近似 GCD 的值为 g 。

样例输入

5 3
1 3 6 4 10

样例输出

5

提示

满足条件的子数组有 5 个:

[1, 3]:将 1 修改为 3 后,这个子数组的最大公约数为 3 ,满足条件。

[1, 3, 6]:将 1 修改为 3 后,这个子数组的最大公约数为 3 ,满足条件。

[3, 6]:这个子数组的最大公约数就是 3 ,满足条件。

[3, 6, 4]:将 4 修改为 3 后,这个子数组的最大公约数为 3 ,满足条件。

[6, 4]:将 4 修改为 3 后,这个子数组的最大公约数为 3,满足条件。

对于 20% 的评测用例,2 ≤ n ≤ 102;

对于 40% 的评测用例,2 ≤ n ≤ 103;

对于所有评测用例,2 ≤ n ≤ 105 ,1 ≤ g, ai ≤ 109。

太难先放一下下次再看

用双指针不断相加

双指针, 用一个指针 i 表示 表示 以 i 结尾的子数组修改一次后左端最远 延伸到 j , 那么以 i 结尾的子数组 左端取任意的 j ~ i - 1 都是满足条件的子数组

#include
using namespace std;

const int N = 1e5 + 10;

int n, g;
int a[N];

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}


int main()
{
//    freopen("a.in", "r", stdin);
//    freopen("a.out", "w", stdout);
    scanf("%d%d", &n, &g);

    for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);

    int last = 0;
    long long res = 0;
    for (int i = 1, j = 1; i <= n; i ++ )
    {
        int t = gcd(g, a[i]);
        if (t != g) j = last + 1, last = i;
        
        printf("i:%d j:%d last=%d\n",i,j,last);
        
        if (i - j + 1 >= 2) res += i - j;
        printf("%lld\n", res);
    }

    printf("%lld", res);

    return 0;
}

找规律用等差数列

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n=sc.nextLong();
        int m=sc.nextInt();
        long []arr=new long[100010];
        int l=1;
        for(long i=1;i<=n;i++){
            int a=sc.nextInt();
            if(a%m!=0){
                arr[l]=i;
                l++;
            }
        }
        arr[l]=n+1;
        long sum=0;
        for(int i=2;i

你可能感兴趣的:(蓝桥杯,蓝桥杯,职场和发展)