目录
题目链接:
官方题解:
概述:
总结反思:
题目
T1:
题目分析:
错误代码:
错因:
AC代码:
T2:
题目分析:
赛时代码:
AC代码
T3:
题目分析:
参考代码:
题目链接:
file:///G:/zlx/1002/20241002.pdf
官方题解:
file:///C:/Users/Administrator/Desktop/%E6%99%AE%E5%8F%8A1%E9%A2%98%E8%A7%A3%E5%92%8Cstd.pdf
概述:
本次模拟整体不是很难。达标线为230
总结反思:
1,本次不应该丢的分有T1和T2的100分,
2,有些题目思想过于复杂
改进:看题再慢些,争取T1、2少丢分
题目
T1:
题目分析:
因为对于每一个大于等于 2 的数字,一定可以找到另一个数字可以将它除成质数(素因子分解定理)所以输出不是0就是1
错误代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
bool zhishu(int x) {
for(int i=2; i<=sqrt(x); i++)
if(x%i==0) return false;
return true;
}
int yz(int x) {
for(int i=x/2+1;i>1; i--)
if(x%i==0) return x;
return 0;
}
signed main() {
freopen("divide.in","r",stdin);
freopen("divide.out","w",stdout);
int n;
cin>>n;
int sum=0;
if(zhishu(n)){
cout<<0;
return 0;
}
while(!zhishu(n)) {
if(yz(n)) {
n/=yz(n);
sum++;
}else break;
}
cout<<sum;
return 0;
}
错因:
思考太多,所以T了1个点,不需要计算这个数的因子。
AC代码:
#include<bits/stdc++.h>
#define int long long //题目范围是1e10 所以需要long long存储
using namespace std;
bool zhishu(int x) {//判断素数
for(int i=2; i<=sqrt(x); i++) {//进行因子枚举
if(x%i==0) return false;
}
return true;
}
signed main() {
freopen("divide.in","r",stdin);
freopen("divide.out","w",stdout);
int n;
cin>>n;
int sum=0;
if(zhishu(n)){//是素数就输出0,反之输出1
cout<<0;
return 0;
}else cout<<1;
return 0;
}
T2:
题目分析:
有几个0,就需要计算有几个mex(这些mex最起码为1),否则多出来的集合缺少的自然数一定为0,不用计算。
赛时代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int b[1050],n,maxn=0,sum=0,maxn1=0,k;
signed main() {
freopen("split.in","r",stdin);
freopen("split.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++) {
cin>>k;
b[k]++;
if(k>maxn1) maxn1=k;
}
for(int i=1; i<=maxn1; i++)
if(b[i]>maxn) maxn=b[i];
for(int i=1; i<=maxn; i++) {
for(int j=maxn1; j>=0; j--) {
if(b[j]) {
maxn1=j;
break;
}
}
if(b[0]==0) {
for(int j=1; j<=maxn1; j++) {
if(b[j])b[j]--;
}
} else {
for(int j=0; j<=1000; j++) {
if(b[j]>0) b[j]--;
else {
sum+=j;
break;
}
}
}
}
cout<<sum;
return 0;
}
(思路非常混乱,20分)
AC代码
#include<bits/stdc++.h>
#define int long long//不管用不用得到,先写出来
using namespace std;
int b[1050],n,maxn,sum,cnt,k;
signed main() {
freopen("split.in","r",stdin);
freopen("split.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++) {
cin>>k;
b[k]++;
maxn=max(k,maxn);
}
int cnt=b[0];
for(int i=1; i<=cnt; i++)
for(int j=1; j<=maxn+5; j++)
if(b[j]) b[j]--;
else {
sum+=j;
break;
}
cout<<sum;
return 0;
}
T3:
题目分析:
求pos左需要修改多少次才能变成最长不下降子序列,右为最长不上升子序列。最后考虑顶部是否需要被修改
参考代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,top,ans,a[100005],S[100005],sp[100005];
int main(){
freopen("town.in","r",stdin);
freopen("town.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
S[++top]=a[1];
for(int i=2;i<m;i++){
if(a[i]>=S[top]) S[++top]=a[i];
else {
int pos=lower_bound(S+1,S+top+1,a[i])-S;
S[pos]=a[i];
}
}
if(S[top]<=a[m]) top++;
else a[m]=2e9;
ans+=m-top;
top=0,S[++top]=a[n];
for(int i=n-1;i>m;i--){
if(a[i]>=S[top]) S[++top]=a[i];
else{
int pos=lower_bound(S+1,S+top+1,a[i])-S;
S[pos]=a[i];
}
}
ans+=n-m-top;
cout<<ans;
return 0;
}