CCF—CSP第一题题解(C++)

举报
御麟 发表于 2023/03/13 14:31:55 2023/03/13
【摘要】 ​ 本文是原创的CSP第一题的题解,自认为代码还算简短整洁比较菜,只有历届第一题全部做完了前三次CSP因为是先看了Acwing课程的缘故,代码与y总的类似感谢y总为普及算法教育做的努力​编辑Acwing本文会持续更新目录13年12月CCF计算机软件能力认证-出现次数最多的数第一次csp-相反数第二次csp-相邻数对第三次csp-门禁系统第四次csp-图像旋转第五次csp-数列分段第六次csp...

 本文是原创的CSP第一题的题解,自认为代码还算简短整洁

比较菜,只有历届第一题全部做完了

前三次CSP因为是先看了Acwing课程的缘故,代码与y总的类似

感谢y总为普及算法教育做的努力

编辑

Acwing

本文会持续更新

目录

13年12月CCF计算机软件能力认证-出现次数最多的数

第一次csp-相反数

第二次csp-相邻数对

第三次csp-门禁系统

第四次csp-图像旋转

第五次csp-数列分段

第六次csp-数位之和

第七次csp-折点计数

第八次csp-最大波动

第九次csp-中间数

第十次csp-分蛋糕

第十一次csp-打酱油

第十二次csp-最小差值

(枚举) O(n)C++ 代码

算法2(暴力枚举) O(n*n)C++ 代码

第十三次csp-跳一跳

第十四次csp-卖菜

第十五次csp-小明上学

第十六次csp-小中大

第十七次csp-小明种苹果

第十八次csp-报数

第十九次csp-线性分类器

第二十次csp-称检测点查询

第二十一次csp-期末预测之安全指数

第二十二次csp-灰度直方图

第二十三次csp-数组推导

第二十四次csp-序列查询

第二十五次csp-未初始化警告

第二十六次csp-归一化处理

第二十七次csp-如此编码



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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。