目录
题目链接:
官方题解:
概述:
总结反思:
题目
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,反之输出1cout<<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;
}