2022-03-04每日刷题打卡

一、试题 历届真题 k倍区间【第八届】【省赛】【B组】

(1)问题描述

资源限制

时间限制:1.0s 内存限制:256.0MB

  给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间。

  你能求出数列中总共有多少个K倍区间吗?

输入格式

  -----
  第一行包含两个整数N和K。(1 <= N, K <= 100000)
  以下N行每行包含一个整数Ai。(1 <= Ai <= 100000)

输出格式

  -----
  输出一个整数,代表K倍区间的数目。


  例如,

输入格式

  5 2
  1
  2
  3
  4
  5

  程序应该输出:
  6

(2)代码实现

        

import java.util.Scanner;
 
public class Main {
	public static void main(String[] args) {
		int n, k;
		long ans = 0;
		Scanner sc = new Scanner(System.in);
		n=sc.nextInt();
		k=sc.nextInt();
		int [] sum = new int [100001];
		int [] num = new int [100001];
		int [] cnt = new int [100001];
		for(int i = 1; i <= n; i++){
			num[i] = sc.nextInt();
			sum[i] = (sum[i-1] + num[i])%k;
			ans += cnt[sum[i]];
			cnt[sum[i]]++;
		}
		long a = ans +(long)cnt[0];
System.out.println(a);
	}
 
}

 二、试题 历届真题 交换瓶子【第七届】【省赛】【B组】

(1)问题描述

        

资源限制

时间限制:1.0s   内存限制:256.0MB

  有N个瓶子,编号 1 ~ N,放在架子上。

  比如有5个瓶子:
  2 1 3 5 4

  要求每次拿起2个瓶子,交换它们的位置。
  经过若干次后,使得瓶子的序号为:
  1 2 3 4 5

  对于这么简单的情况,显然,至少需要交换2次就可以复位。

  如果瓶子更多呢?你可以通过编程来解决。

  输入格式为两行:
  第一行: 一个正整数N(N<10000), 表示瓶子的数目
  第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。

  输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。

  例如,输入:
  5
  3 1 2 5 4

  程序应该输出:
  3

  再例如,输入:
  5
  5 4 3 2 1

  程序应该输出:
  2

(2)代码实现

        

import java.util.*;
public class Main {
    static Scanner in = new Scanner(System.in);

    public static void main(String[] args) {
        int num = 0;
        int n= in.nextInt();
        int[] arr = new int[10002];
        for (int i = 1; i <= n; i++) {
            arr[i] = in.nextInt();
        }
        for (int i = 1; i <= n; i++) {
            while (arr[i] != i) {
                int t = arr[arr[i]];
                arr[arr[i]] = arr[i];
                arr[i] = t;
                num++;
            }
        }
        System.out.println(num);
    }
}

 三、试题 历届真题 四平方和【第七届】【省赛】【B组】

(1)问题描述

        

资源限制

时间限制:1.0s   内存限制:256.0MB

  四平方和定理,又称为拉格朗日定理:
  每个正整数都可以表示为至多4个正整数的平方和。
  如果把0包括进去,就正好可以表示为4个数的平方和。

  比如:
  5 = 0^2 + 0^2 + 1^2 + 2^2
  7 = 1^2 + 1^2 + 1^2 + 2^2
  (^符号表示乘方的意思)

  对于一个给定的正整数,可能存在多种平方和的表示法。
  要求你对4个数排序:
  0 <= a <= b <= c <= d
  并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法


  程序输入为一个正整数N (N<5000000)
  要求输出4个非负整数,按从小到大排序,中间用空格分开

  例如,输入:
  5
  则程序应该输出:
  0 0 1 2

  再例如,输入:
  12
  则程序应该输出:
  0 2 2 2

  再例如,输入:
  773535
  则程序应该输出:
  1 1 267 838

(2)代码实现

        

import java.util.*;
public class Main {
    static Scanner in=new Scanner(System.in);
    public static void main(String[] args) {
        int n= in.nextInt();
        for (int i = 0; i < 5000; i++) {
            if (i * i > n)
                break;
            for (int j = i; j < 5000; j++) {
                if (i * i + j * j > n)
                    break;
                for (int k = j; k < 5000; k++) {
                    if (i * i + j * j + k * k > n)
                        break;
                    for (int t = k; t < 5000; t++) {
                        if (i * i + j * j + k * k + t * t > n)
                            break;
                        if (i * i + j * j + k * k + t * t == n) {
                            System.out.println(i+" "+j+" "+k+" "+t);
                            return;
                        }
                    }
                }
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Apache POI 库来读取本地的 xlsx 文件,并实现计算每个工号每天的最晚打卡时间去最早打卡时间的功能。下面是一个示例代码: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.IOException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; public class ReadXlsxFile { public static void main(String[] args) { String filePath = "path/to/xlsx/file.xlsx"; // 替换为你的xlsx文件路径 try (FileInputStream fis = new FileInputStream(filePath); Workbook workbook = new XSSFWorkbook(fis)) { Sheet sheet = workbook.getSheetAt(0); // 假设数据在第一个工作表中 Map<String, LocalDateTime[]> employeeTimes = new HashMap<>(); for (Row row : sheet) { Cell employeeIdCell = row.getCell(0); Cell timestampCell = row.getCell(1); String employeeId = employeeIdCell.getStringCellValue(); LocalDateTime timestamp = LocalDateTime.parse(timestampCell.getStringCellValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); LocalDate date = timestamp.toLocalDate(); LocalTime time = timestamp.toLocalTime(); LocalDateTime dateTime = LocalDateTime.of(date, time); if (employeeTimes.containsKey(employeeId)) { LocalDateTime[] times = employeeTimes.get(employeeId); times[0] = times[0].isBefore(dateTime) ? times[0] : dateTime; // 更新最晚打卡时间 times[1] = times[1].isAfter(dateTime) ? times[1] : dateTime; // 更新最早打卡时间 } else { employeeTimes.put(employeeId, new LocalDateTime[]{dateTime, dateTime}); } } for (Map.Entry<String, LocalDateTime[]> entry : employeeTimes.entrySet()) { String employeeId = entry.getKey(); LocalDateTime[] times = entry.getValue(); LocalDateTime earliestTime = times[1]; LocalDateTime latestTime = times[0]; System.out.println("Employee ID: " + employeeId); System.out.println("Earliest Time: " + earliestTime); System.out.println("Latest Time: " + latestTime); System.out.println("Time Difference: " + earliestTime.until(latestTime)); System.out.println(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 请将代码中的 `path/to/xlsx/file.xlsx` 替换为你的 xlsx 文件的实际路径。此代码会使用 Apache POI 库读取 xlsx 文件的每一行,将工号和对应的打卡时间提取出来,并计算每个工号每天的最晚打卡时间去最早打卡时间,并输出到控制台。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值