CCF CSP认证JAVA(六)

201509-1数列分段

问题描述

给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段?

输入格式

输入的第一行包含一个整数n,表示数列中整数的个数。
  第二行包含n个整数a1, a2, …, an,表示给定的数列,相邻的整数之间用一个空格分隔。

输出格式

输出一个整数,表示给定的数列有多个段。

样例输入

8
8 8 8 0 12 12 8 0

样例输出

5

样例说明

8 8 8是第一段,0是第二段,12 12是第三段,倒数第二个整数8是第四段,最后一个0是第五段。

评测用例规模与约定

1 ≤ n ≤ 1000,0 ≤ ai ≤ 1000。

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] nums = new int[n];
        for(int i=0;i<n;i++){
            nums[i]=scanner.nextInt();
        }
        scanner.close();
        int count = 1;
        for(int i=0;i<n-1;i++){
            if(nums[i]!=nums[i+1]){
                count++;
            }
        }
        System.out.println(count);
    }
}

201604-1折点计数

在这里插入图片描述

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] nums = new int[n];
        for(int i=0;i<n;i++){
            nums[i]=scanner.nextInt();
        }
        scanner.close();
        int count = 0;
        for(int i=1;i<n-1;i++){
            int c1 = nums[i]-nums[i-1];
            int c2 = nums[i+1]-nums[i];
            if(c1*c2<0){
                count++;
            }
        }
        System.out.println(count);
    }
}

201609-1最大波动

问题描述

小明正在利用股票的波动程度来研究股票。小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少。

输入格式

输入的第一行包含了一个整数n,表示小明拿到的收盘价格的连续天数。
  第二行包含n个正整数,依次表示每天的收盘价格。

输出格式

输出一个整数,表示这只股票这n天中的最大波动值。

样例输入

6
2 5 5 7 3 5

样例输出

4

样例说明

第四天和第五天之间的波动最大,波动值为|3-7|=4。

评测用例规模与约定

对于所有评测用例,2 ≤ n ≤ 1000。股票每一天的价格为1到10000之间的整数。

import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] nums = new int[n];
        for(int i=0;i<n;i++){
            nums[i]=scanner.nextInt();
        }
        scanner.close();
        int count = 0;
        for(int i=1;i<n;i++){
            int c = nums[i]-nums[i-1];
            count = Math.max(count,Math.abs(c));
        }
        System.out.println(count);
    }
}

202104-2邻域均值

在这里插入图片描述

眉头一皱,发现事情并不简单

这不就是二维的前缀和嘛,又遇到了,真巧!

再复习一遍原理:
在这里插入图片描述
红=绿-蓝-紫+黄

记不清时候自己推导一下就好了!

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //n个像素,每个元素为[0,L)内的整数,参数r,阈值t
        int n = scanner.nextInt(), L = scanner.nextInt(), r = scanner.nextInt(), t = scanner.nextInt();
        int[][] arr = new int[n+1][n+1];
        int[][] sumArr = new int[n+1][n+1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                arr[i][j]=scanner.nextInt();
                sumArr[i][j]=sumArr[i-1][j]+sumArr[i][j-1]+arr[i][j]-sumArr[i-1][j-1];
            }
        }
        scanner.close();
        int count =0;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                int a = Math.max(1,i-r),b = Math.min(n,i+r),c = Math.max(1,j-r),d = Math.min(n,j+r);
                int temp = (b-a+1)*(d-c+1);
                if (temp*t>=sumArr[b][d]-sumArr[b][c-1]-sumArr[a-1][d]+sumArr[a-1][c-1]){
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

201703-1分蛋糕

问题描述

小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个朋友,小明总是先将自己手中编号最小的蛋糕分给他,当这个朋友所分得蛋糕的重量不到k时,再继续将剩下的蛋糕中编号最小的给他,直到小明的蛋糕分完或者这个朋友分到的蛋糕的总重量大于等于k
  请问当小明的蛋糕分完时,总共有多少个朋友分到了蛋糕。

输入格式

输入的第一行包含了两个整数n, k,意义如上所述。
  第二行包含n个正整数,依次表示a1, a2, …, an

输出格式

输出一个整数,表示有多少个朋友分到了蛋糕。

样例输入

6 9
2 6 5 6 3 5

样例输出

3

样例说明

第一个朋友分到了前3块蛋糕,第二个朋友分到了第4、5块蛋糕,第三个朋友分到了最后一块蛋糕。

评测用例规模与约定

对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ k ≤ 10000,1 ≤ ai ≤ 1000。

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int k = scanner.nextInt();
        int[] nums = new int[n];
        for(int i=0;i<n;i++){
            nums[i]=scanner.nextInt();
        }
        scanner.close();
        int count = 0;
        int sum = 0;
        for(int i=0;i<n;i++){
            if(sum==0){
                count++;
            }
            sum+=nums[i];
            if(sum>=k){
                sum=0;
            }
        }
        System.out.println(count);
    }
}

202009-1称检测点查询

在这里插入图片描述


import java.util.*;

/**
 * @Author: zhang yu zhu
 * @Date: 2021/11/30 15:57
 */
public class demo20 {
    public static void main(String [] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt(),X = scanner.nextInt(),Y=scanner.nextInt();
        PriorityQueue<int[]> priorityQueue = new PriorityQueue<>(new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[1]!=o2[1])//按第二键值做参考,也就是distance
                    return o1[1]-o2[1];
                else {//如果distance相同,按第一键值,也就是编号排序
                    return o1[0]-o2[0];
                }
            }
        });
// lambda表达式写法:
//        PriorityQueue<int[]> priorityQueue = new PriorityQueue<>((o1, o2) -> {
//            if (o1[1]!=o2[1])
//                return o1[1]-o2[1];
//            else {
//                return o1[0]-o2[0];
//            }
//        });
        for (int i=0;i<n;i++){
            int distance = (int) (Math.pow(X-scanner.nextInt() ,2) + Math.pow( Y-scanner.nextInt() ,2));
            priorityQueue.add(new int[]{
                    i+1, distance
            });
        }
        for (int i=0;i<3;i++){
            System.out.println(priorityQueue.poll()[0]);
        }
    }
}

比较器升降序说明

//比较器升降序说明
Comparator<Object> cmp = new Comparator<Object>() {
        public int compare(Object o1, Object o2) {
            //升序
            return o1-o2;
            //降序
            return o2-o1;
        }
    };

今日推歌

----《空》 徐海俏

不过是大梦一场空
不过是孤影照惊鸿
不过是白驹之过一场梦
梦里有一些相逢
有道是万物皆虚空
有道是苦海最无穷
有道是人生得意须尽欢
难得最是心从容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星回昭以烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值