CCF—CSP第一题题解(C++)
本文是原创的CSP第一题的题解,自认为代码还算简短整洁
前三次CSP因为是先看了Acwing课程的缘故,代码与y总的类似
感谢y总为普及算法教育做的努力
编辑
本文会持续更新
13年12月CCF计算机软件能力认证-出现次数最多的数
#include<iostream> #include<algorithm> using namespace std; const int N = 1010; int q[N]; int n, cnt, m, t; int main() { cin >> n; for (int i = 0; i < n; i++) cin >> q[i]; sort(q , q + n); for (int i = 0; i <= n-1; i++) { if (q[i] != q[i - 1]) { if (cnt > m) { t = q[i - 1]; m = cnt; } cnt = 1; } if (q[i] == q[i - 1]) cnt++; } cout << t << endl; return 0; }
第一次csp-相反数
#include<iostream> #include<algorithm> using namespace std; #include<vector> const int N=1010; int n; int q[N]; int res; int main(){ cin >>n; while(n--){ int x; scanf("%d",&x); q[abs(x)]++; } for(int i=0;i<N;i++){ if(q[i]==2)res++; } cout <<res<<endl; return 0; }
第二次csp-相邻数对
#include<iostream> #include<algorithm> using namespace std; const int N=1010; int q[N]; int n; int res; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&q[i]); sort(q+1,q+n+1); for(int i=2;i<=n;i++) if(q[i]-1==q[i-1]) res++; cout <<res; return 0; }
第三次csp-门禁系统
#include<iostream> using namespace std; const int N=1010; int q[N],cnt[N]; int n; int main() { cin >> n; for(int i=1;i<=n;i++) { cin >> q[i]; cnt[q[i]]++; cout << cnt[q[i]] << ' '; } return 0; }
第四次csp-图像旋转
#include<iostream> using namespace std; const int N=1010; int q[N][N]; int n,m; int main(){ cin >>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin >>q[i][j]; for(int j=m;j>0;j--){ for(int i=1;i<=n;i++){ cout <<q[i][j]<<' '; } cout <<endl; } }
第五次csp-数列分段
#include<iostream> using namespace std; int temp; int n; int res; int main(){ cin >>n; cin >>temp; //将第一个数据存入temp n--;res++; //记录第一段数据开始,res++ while(n--){ int x; cin >>x; if(temp!=x){ //如果输入的数据与前一段数据不一样,res++ res++; temp=x; //将数据更新成下一段的值 } } cout <<res<<endl; return 0; }
第六次csp-数位之和
#include<iostream> using namespace std; int res; int main(){ string a; cin >>a; for(int i=0;i<a.size();i++){ res+=a.at(i)-'0'; } cout <<res<<endl; return 0; }
第七次csp-折点计数
#include<iostream> using namespace std; const int N=1010; int n; int q[N]; int res; int main(){ cin >>n; for(int i=1;i<=n;i++) cin >>q[i]; for(int i=2;i<=n-1;i++){ if(q[i]>q[i-1]&&q[i]>q[i+1]) res++; if(q[i]<q[i-1]&&q[i]<q[i+1]) res++; } cout <<res<<endl; return 0; }
第八次csp-最大波动
#include<iostream> using namespace std; const int N=1010; int n; int q[N]; int res; int main(){ cin >>n; for(int i=1;i<=n;i++) cin >>q[i]; for(int i=2;i<=n;i++){ res=max(res,abs(q[i]-q[i-1])); } cout <<res<<endl; return 0; }
第九次csp-中间数
#include<iostream> #include<algorithm> using namespace std; const int N=1010; int q[N]; int n; int l,r; int res=-1; //存储满足条件的数字 int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&q[i]); sort(q+1,q+n+1); int x=q[n/2+1]; for(int i=1;i<=n;i++){ if(q[i]>x) l++; if(q[i]<x) r++; } if(l==r) res=q[n/2+1]; cout <<res<<endl; return 0; }
第十次csp-分蛋糕
#include<iostream> using namespace std; const int N=1010; int k; int n; int q[N]; int res; int sum; int main(){ cin >>n>>k; for(int i=1;i<=n;i++) cin >>q[i]; for(int i=1;i<=n;i++){ sum+=q[i]; if(sum>=k){ res++; sum=0; } } if(sum!=0) res++; cout <<res<<endl; return 0; }
第十一次csp-打酱油
#include<iostream> using namespace std; int n,res; int main(){ cin >>n; while(1){ if(n>=50){ res+=7,n-=50; } else if(n>=30){ res+=4,n-=30; } else{ res+=n/10; break; } } cout <<res<<endl; return 0; }
第十二次csp-最小差值
(枚举) O(n)
C++ 代码
#include<iostream> #include<algorithm> using namespace std; const int N=1010; int n; int q[N]; int res=10010; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin >>q[i]; } sort(q+1,q+1+n); for(int i=2;i<=n;i++){ res=min(res,q[i]-q[i-1]); } cout <<res<<endl; return 0; }
算法2
(暴力枚举) O(n*n)
C++ 代码
#include<iostream> using namespace std; const int N=1010; int n; int q[N]; int res=10010; int main(){ cin>>n; for(int i=1;i<=n;i++){ cin >>q[i]; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j) res=min(res,abs(q[i]-q[j])); } } cout <<res<<endl; return 0; }
第十三次csp-跳一跳
#include<iostream> using namespace std; int temp; int res; int main(){ while(1){ int x; cin >>x; if(x==1) temp=0,res++; else if(x==2) res+=temp+=2; else break; } cout <<res<<endl; return 0; }
第十四次csp-卖菜
#include<iostream> using namespace std; const int N=1010; int q[N]; int n; int x; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&q[i]); x=(q[1]+q[2])/2; printf("%d ",x); for(int i=2;i<=n-1;i++){ x=(q[i]+q[i+1]+q[i-1])/3; printf("%d ",x); } x=(q[n]+q[n-1])/2; printf("%d ",x); return 0; }
第十五次csp-小明上学
#include<iostream> using namespace std; int res; int r,y,g; int n; int a,b; int main(){ cin >>r>>y>>g; cin >>n; while(n--){ cin >>a>>b; if(a!=3){ res+=b; if(a==2) res+=r; } } cout <<res<<endl; return 0; }
第十六次csp-小中大
#include<iostream> #include<algorithm> using namespace std; const int N=100010; int q[N]; int n; float mid; int main(){ cin >>n; for(int i=1;i<=n;i++) cin >>q[i]; sort(q+1,q+n+1); if(n%2==1) cout <<q[n]<<' '<<q[n/2+1]<<' '<<q[1]; else{ if((q[n/2]+q[n/2+1])%2==0){ int x=(q[n/2]+q[n/2+1])/2; cout <<q[n]<<' '<<x<<' '<<q[1]; } else{ mid=((float)q[n/2]+(float)q[n/2+1])/2; printf("%d ",q[n]); printf("%.1f %d",mid,q[1]); } } return 0; }
第十七次csp-小明种苹果
#include<iostream> using namespace std; int n,m; int res,res2,res3; int sum; int main(){ cin >>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m+1;j++){ int x; cin >>x; res+=x; if(j!=1) sum-=x; } if(sum>res3){ res3=sum; res2=i; } sum =0; } cout <<res<<' '<<res2<<' '<<res3<<endl; return 0; }
第十八次csp-报数
#include<iostream> using namespace std; int n; int q[4]; int main(){ cin >>n; //输入n for(int i=1;i<=n;i++){ if(i%7==0||i%10==7||i/10%10==7||i/100==7) q[i%4]++,n++; //当这个数字要被跳过时,计数加一,同时意味着要多报一个数字才能报够n次,n加一 } for(int i=1;i<4;i++){ cout <<q[i]<<endl; //输出甲乙丙跳过的次数 } cout <<q[0]; //输出丁跳过的次数 return 0; }
第十九次csp-线性分类器
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=1010; typedef long long ll; typedef pair<int,int> PII; int sum1,sum2; int s1,s2; PII x; PII A[N],B[N]; int n,m; int main(){ cin >>n>>m; char c; while(n--){ ll a,b; cin >>a>>b>>c; //输入这个点的坐标和类型 x.first=a; x.second=b; if(c=='A') //A类点存到数组A,B类点存入数组B,并统计两类点的个数 A[sum1++]=x; else if(c=='B') B[sum2++]=x; } while(m--){ int j,k,l; cin >>j>>k>>l; //输入直线的参数 for(int i=0;i<sum1;i++){ ll q=A[i].first; ll w=A[i].second; if(q*k+l*w>-j) s1++; //这个点在直线一侧,计数加一 } for(int i=0;i<sum2;i++){ ll q=B[i].first; ll w=B[i].second; if(q*k+l*w<-j) s2++; //这个点在直线另外一侧,计数加一 } if(s1==0&&s2==0||s1==sum1&&s2==sum2) //如果所有A点都在直线这一侧,B类点都另一侧,或者两类点都不在 printf("Yes\n"); else printf("No\n"); s1=0,s2=0; } return 0; }
第二十次csp-称检测点查询
#include<iostream> #include<algorithm> using namespace std; #include<utility> const int N=210; pair<int,int> q[N]; int x,y,a,b,n; int main(){ scanf("%d",&n); scanf("%d%d",&x,&y); for(int i=1;i<=n;i++){ cin >>a>>b; q[i].first=(a-x)*(a-x)+(b-y)*(b-y); q[i].second=i; } sort(q+1,q+n+1); for(int i=1;i<4;i++) cout <<q[i].second<<endl; return 0; }
第二十一次csp-期末预测之安全指数
#include<iostream> using namespace std; int n,res,x,y; int main(){ cin >>n; for(int i=0;i<n;i ++){ cin >>x>>y; res +=x*y; } cout <<max(res,0); return 0; }
第二十二次csp-灰度直方图
#include<iostream> using namespace std; const int N=510; int n,m,L; int q[N]; int main(){ cin >>n>>m>>L; int u=n*m; while(u--){ int x; cin>>x; q[x]++; } for(int i=0;i<L;i++) cout <<q[i]<<' '; return 0; }
第二十三次csp-数组推导
#include<iostream> using namespace std; int n,x,temp,s1,s2; int main(){ cin >>n; while(n--){ cin >>x; s1+=x; if(x>temp) //出现比temp大的x加入s2,否则忽略 s2+=temp=x; //将当前出现的最大的x存入temp } cout <<s1<<endl<<s2; return 0; }
第二十四次csp-序列查询
#include<iostream> using namespace std; const int N=1e7+10; int n,res,k; int q[N]; int main(){ cin >>n>>k; for(int i=1;i<=n;i++) scanf("%d",&q[i]); for(int i=2;i<=n;i++){ int x=q[i]-q[i-1]; x=x*(i-1); res+=x; } int x=k-q[n]; res+=n*x; cout <<res<<endl; return 0; }
第二十五次csp-未初始化警告
#include <iostream> using namespace std; const int N=1e5+10; bool q[N]; int n,k; int x,y; int res; int main(){ q[0]=true; cin >>n>>k; while(k--){ cin >>x>>y; if(!q[y]) res++; q[x]=true; } cout <<res<<endl; return 0; }
第二十六次csp-归一化处理
#include<iostream> using namespace std; #include<cmath> const int N=1010; int n; float q[N]; float ave,var; //定义平均数和方差,在程序中也可能是求方差和平均数的中间值,var最终值是标准差 float res; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%f",&q[i]); //将数据读入数组 ave+=q[i]; //求一下数据的和 } ave=ave/n; //求平均数 for(int i=1;i<=n;i++){ var+=(q[i]-ave)*(q[i]-ave); } var=sqrt(var/n); //求方差 for(int i=1;i<=n;i++){ res=(q[i]-ave)/var; //求出归一化处理的数据 cout <<res<<endl; //将归一化处理的数据输出 } return 0; }
第二十七次csp-如此编码
#include<iostream> using namespace std; const int N=25; int n,m; int q[N]; int acc[N]; int ans[N]; int main(){ cin >>n>>m; acc[0]=1;q[0]=1; for(int i=1;i<=n;i++) cin >>q[i]; for(int i=1;i<=n+1;i++) acc[i]=ans[i]=q[i-1]*acc[i-1]; for(int i=1;i<=n+1;i++) ans[i]=m%ans[i]; for(int i=n;i>=0;i--) ans[i]=ans[i]-ans[i-1]; for(int i=2;i<=n+1;i++){ ans[i]=ans[i]/acc[i-1]; cout <<ans[i]<<' '; } return 0; }
本文会持续更新