蓝桥杯31天打卡day5

1、数的分解,填空答案:40785

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2和 4,一共有多少种不同的分解方法?

注意交换 3个整数的顺序被视为同一种方法,例如 1000+1001+18和1000+1001+18 被视为同一种。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

暴力解决

import java.io.*;
public class Main10{
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) {
        int count=0;
        for (int i = 1; i < 2019; i++) {//三个数字进行相对平移,即保证不重复
            for (int j = i+1; j < 2019; j++) {
                for (int k = j+1; k < 2019; k++) {
                    if(i+j+k==2019){
                        String s=i+""+j+""+k;
                        if(!s.contains("2")&&!s.contains("4")){//使用contains函数判断满足条件的个数
                            count++;
                        }
                    }
                }
            }
        }
        System.out.println(count);
        
    }
}

 2、猜生日

枚举即可,注意补0

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

今年的植树节(2012年 3月 12 日),小明和他的叔叔还有小伙伴们一起去植树。休息的时候,小明的同学问他叔叔多大年纪,他叔叔说:“我说个题目,看你们谁先猜出来!”

“把我出生的年月日连起来拼成一个 8 位数(月、日不足两位前补 0)正好可以被今天的年、月、日整除!”

他想了想,又补充到:“再给个提示,我是 6月出生的。”

根据这些信息,请你帮小明算一下,他叔叔的出生年月日。

格式是年月日连成的 8 位数。例如,如果是 1948 年 6月 12 日,就写:19480612。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M
import java.io.*;
public class Main10 {
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static String ymd = "";
    public static void main(String[] args) throws Exception {
        for (int i=1900;;i++){
            for (int j=1;j<=30;j++){//6月固定30天
                int sum =i*10000+600+j;
                if (sum%2012==0&&sum%3==0&&sum%12==0){//被年月日整除
                    if (j<10){//日如果不足10需要补0
                        ymd = i+"06"+"0"+j;
                    }else{
                        ymd = i+"06"+j;
                    }
                    out.println(ymd);
                    out.flush();
                    return;
                }
            }
        }
    }

}

3、 

 成绩统计

注意四舍五入

题目描述

小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。

输入描述

输入的第一行包含一个整数 (1≤n≤10^4),表示考试人数。

接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出描述

输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。

输入输出样例

示例

输入

7
80
92
56
74
88
100
0

输出

71%
43%

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 256M
import java.util.Scanner;
public class Main {
  static int pa = 0;
  static int ex = 0;
    public static void main(String[] args) {
        Scanner sc= new Scanner(System.in);
        int n = sc.nextInt();
        for(int i = 0;i<n;i++){
          int a = sc.nextInt();
          if(a>=85){
          ex++;
          }
          if(a>=60){
            pa++;
          }

        }//使用Math.round进行四舍五入,必须将数据改为double或者float型才可以,所以乘数加了.0,注意round方法只能保留两位小数
        System.out.println(Math.round(pa*100.0/n)+"%");
        System.out.println(Math.round(ex*100.0/n)+"%");
        sc.close();
    }
}

4、最大和

动态规划+质数筛

如果数据过大推荐使用欧拉筛

感谢博主

埃拉托斯特尼筛法 VS 欧拉筛法 (素数筛选) Java_埃拉托斯特尼筛法java_TinyDolphin的博客-CSDN博客

问题描述

小蓝在玩一个寻宝游戏, 游戏在一条笔直的道路上进行, 道路被分成了 n 个方格, 依次编号 1 至 n, 每个方格上都有一个宝物, 宝物的分值是一个整数 (包括正数、负数和零), 当进入一个方格时即获得方格中宝物的分值。小蓝可 以获得的总分值是他从方格中获得的分值之和。

小蓝开始时站在方格 1 上并获得了方格 1 上宝物的分值, 他要经过若干步 到达方格 �n。

当小蓝站在方格 p 上时, 他可以选择跳到 p+1 到 p+D(n−p) 这些方格 中的一个, 其中 D(1)=1,D(x)(x>1) 定义为 x 的最小质因数。

给定每个方格中宝物的分值, 请问小蓝能获得的最大总分值是多少。

输入格式

输入的第一行包含一个正整数 n 。

第二行包含 n 个整数, 依次表示每个方格中宝物的分值。

输出格式

输出一行包含一个整数, 表示答案。

样例输入


5

1 -2 -1 3 5

样例输出


8

样例输出

最优的跳跃方案为: 1→3→4→51→3→4→5 。

import java.util.*;
import java.io.*;
public class Main9 {
    static int N = 10010;
    static int []nums = new int[N];
    static int []dp = new int[N];
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
 public static void main(String[] args) throws IOException {
    	int n = Integer.parseInt(in.readLine());
        String[]str = in.readLine().split(" ");
        for(int i = 1;i<=n;i++){
          nums[i] = Integer.parseInt(str[i-1]);
        }
        Arrays.fill(dp,Integer.MIN_VALUE);//赋最小值,以免出现负数
        dp[1]=nums[1];//从第一个格子开始,先赋值
        for (int i = 1; i <= n; i++) {//由题知走p+1到p+D(n-p)
            for (int j = 1; j <= D(n-i); j++) {
                dp[i+j]=Math.max(dp[i]+nums[i+j],dp[i+j]);
           //dp[i+j]即是每次移动的距离,j的值从1到D(n-i),即在这个区域变化,宝物的值从nums[i+j]获取
           //如果往后走了宝物的值不如原来,那便不走这一步
            }
        }
        out.println(dp[n]);
        out.flush();
    }
 
    static int D(int n){//找最小质因子
        if(n==1)return 1;
        if(n==2)return 2;
        if(n==3)return 3;
        if(isPrime(n))return n;
        for (int i = 2; i*i <= n ; i++) {
            if(n%i==0&&isPrime(i)){
                return i;
            }
        }
        return n;
    }
    static boolean isPrime(int n){
            for (int i = 2; i*i<=n ; i++) {
                if(n%i==0){
                    return false;
                }
            }
            return true;
        }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值