CSP-J复赛 模拟题一补题报告

该篇文章详细分析了CSP-J复赛中的四道题目,包括数字降级的质因数分解、分组求最大分数和、抢夺地盘的最长子序列优化以及闯关问题的两种贪心和动态规划解法。作者分享了解题过程、代码和反思,强调思维能力和细节处理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSP-J复赛 模拟题一补题报告

2023.10.1 Sat.
S10473吴启瀚

1. 比赛报告

共4题, 第1题AC, 第2题40分, 第3题20分, 第4题TLE

2. 比赛过程

第一题数字降级, 思路很好想, 直接AC
第二题分组,我的思路是用桶记录,如果后面比前面大就把后面赋值成前面的,从后往前遍历,如果不为b[0] > b[i]就让b[0] - b[i], ans += b[i] * (i + 1), 漏了前面的也都要减b[i]
第三题抢夺地盘, 我的思路是贪心, 找1~p-1下降个数, p+1~n上升个数
第四题闯关, 我用贪心来做, 思路不同在于: 我按人依次考虑, 答案分神器在谁手里考虑

3. 题解

3.1 数字降级 down

题目大意: 将一个数字除以它的因子, 最少几次变成一个质数

题目解析: 如果是质数明显答案是0, 如果不是质数应该除以最大的因子例如180 = 22335, 180 / 90(233*5) = 2, 这样就会变成一个质数, 答案为1, 其实是判断素数的题
AC代码:

#include <iostream>
#include <cstdio>
using namespace std;
long long n;
bool f = 0;
int main(){
   
   
	freopen("down.in", "r", stdin);
	freopen("down.out", "w", stdout);
	
	scanf("%lld", &n);
	for(long long i = 2;i*i <= n;i++){
   
   
		if(n % i == 0){
   
   
			f = 1;
			break;
		}
	}
	if(f)	printf("1\n");
	else	printf("0\n");
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

3.2 分组 group

题目大意: 将n个数分组, 每组分数为没出现过最小的自然数, 求最大分数和

题目解析: 考虑有多少个小组分数可以至少为1, 这些小组中必须有一个0。
所以假设0有x个, 那么就说明有x个小组分数至少为1, 此时答案增加x。
再考虑有多少个小组分数可以至少为2这些小组必须有一个1, 并且小组分数至少为2的小组的数量一定小于等于小组分数至少为1的小组数量, 所以要有求 min 的操作。
AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5, M = 1005;
int n, t, b[M], mn, ans;
int main(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值