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(