「做题记录」CSP-J 2021题解

P7909 [CSP-J 2021] 分糖果

作为本场考试的第一题,还是需要一些思考的。

Solution 1 (70pts) \text{Solution 1 (70pts)} Solution 1 (70pts)

枚举 [ L , R ] [L,R] [L,R] 中所有数字,找出对 n n n 取模的最大值。

时间复杂度 O ( R − L ) O(R-L) O(RL),就不放代码了。

Solution 2 (100pts) \text{Solution 2 (100pts)} Solution 2 (100pts)

显然,答案在 [ 0 , n − 1 ] [0,n-1] [0,n1] 之中。

可以观察,枚举 [ L , R ] [L,R] [L,R] 中所有数字,那么它们对 n n n 取模的余数是呈现周期性的,并且一个完整的周期是 [ 0 , n − 1 ] [0,n-1] [0,n1] 中的所有数字都严格单调递增出现。

因为我们要找答案的最大值,那么当 [ L , R ] [L,R] [L,R] 之间包含着一个完整的周期时,答案的最大值就是 n − 1 n-1 n1

如果 [ L , R ] [L,R] [L,R] 之间不包含一个完整的周期,由于对 n n n 取模的余数是严格单调递增出现的,那么此时答案的最大值就是 R   m o d   n R \bmod n Rmodn

对于 [ L , R ] [L,R] [L,R] 之间是否包含一个完整的周期,只需要判断 ⌊ L n ⌋ = ⌊ R n ⌋ \lfloor \frac{L}{n}\rfloor = \lfloor\frac{R}{n}\rfloor nL=nR 是否成立(可以自行思考一下,不做解释。)

得到简短的代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

int main () {
   
	ll n, l, r;
	cin >> n >> l >> r;
	if (l / n == r / n) {
   
		cout << r % n;
	}
	else {
   
		cout << n - 1;
	}
	
	return 0;
}

P7910 [CSP-J 2021] 插入排序

本题需要一些尝试和对于题目细节的敏感。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值