CCF—CSP第一题题解(C++)
【摘要】 本文是原创的CSP第一题的题解,自认为代码还算简短整洁比较菜,只有历届第一题全部做完了前三次CSP因为是先看了Acwing课程的缘故,代码与y总的类似感谢y总为普及算法教育做的努力编辑Acwing本文会持续更新目录13年12月CCF计算机软件能力认证-出现次数最多的数第一次csp-相反数第二次csp-相邻数对第三次csp-门禁系统第四次csp-图像旋转第五次csp-数列分段第六次csp...
本文是原创的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;
}
本文会持续更新
推荐
华为开发者空间发布
让每位开发者拥有一台云主机
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)