ccf-csp历届第一题题解 (二)17-20年 ( •̀ ω •́ )

ccf-csp历届签到题题解(Java&C++)


  嘀嘀嘀,我又来哩~这次送上17年到20年的签到题题解,考虑到上一篇以Java为主,为了兼顾使用c语言的同学,本篇以c++为主嗷,助大家在ccf中好好发挥(~ ̄▽ ̄)~。

题目传送门:

201709-1打酱油    201712-1最小差值
201803-1跳一跳    201809-1卖菜
201812-1小明上学   201903-1大中小
201909-1小明种苹果  201912-1报数
202006-1线性分类器  202009-1检测点查询


试题&AC代码:
  • 打酱油
    201709tips:算是贪心问题吧,有兴趣的可以百度下贪心。反正就是先挑赠品多的方案买。
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int ans = 0;
        while(N>=50){
            N -= 50;
            ans += 7;
        }
        while(N>=30){
            N -= 30;
            ans += 4;
        }
        while(N>=10){
            N -= 10;
            ans += 1;
        }
        System.out.println(ans);
    }
}
  • 最小差值
    201712tips:暴力循环,遍历每一个差值,找出最小的。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,ans=100000;
    cin>>n;
    int num[n];
    for(int i=0;i<n;i++){
        cin>>num[i];
        for(int j=0;j<i;j++){
            if(abs(num[i]-num[j])<ans)
                ans=abs(num[i]-num[j]);
        }
    }
    cout<<ans;
    return 0;
}
  • 跳一跳
    201803tips:简单模拟,count记录连续输入了几个2。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int curr,ans=0,count=0;
    while (1){
        cin>>curr;
        if(curr==0){
            ans+=(2+2*count)*count/2;
            break;
        }
        if(curr==1){
            ans++;
            ans+=(2+2*count)*count/2;
            count=0;
        }
        if(curr==2){
            count++;
        }
    }
    cout<<ans;
    system("pause");
    return 0;
}
  • 卖菜
    201809tips:照着题目描述做就好,很简单的题目。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int first[n];
    for(int i=0;i<n;i++)
        cin>>first[i];
    for(int i=0;i<n;i++){
        if(i!=0&&i!=n-1)
            cout<<(first[i-1]+first[i]+first[i+1])/3<<" ";
        if(i==0)
            cout<<(first[i]+first[i+1])/2<<" ";
        if(i==n-1)
            cout<<(first[i-1]+first[i])/2;
    }
    system("pause");
    return 0;
}
  • 小明上学
    201812tips:简单模拟,重点在于理解题意。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int r,y,g,n,k,t;
    int sum=0;
    cin>>r>>y>>g;
    cin>>n;
    for(int i=0;i<n;++i){
        cin>>k>>t;
        if(k == 0 || k == 1)
            sum += t;
        if(k == 2)
            sum += (t + r);
        if(k == 3)
            sum += 0;
    }
    cout<<sum;
    system("pause");
    return 0;
}
  • 大中小
    大中小tips:先排序,最小最大值和中位数直接通过下标就能找到。题目虽简单,但是这里需要注意几点,一是数组要写在main函数前,也就是数组放在堆内存中防止栈内存溢出。二是保留一位小数直接用printf输出比较方便;如果用cout可以配合setprecision(n)控制精度;用Java的同学可以使用System.out.printf(),根c一样的写法。
#include<bits/stdc++.h>
using namespace std;
int num[100005];
int main(){
    int n;
    cin>>n;
    for(int i = 0; i < n; i++)
        cin>>num[i];
    sort(num, num + n);
    if(n % 2 == 1) {
        printf("%d %d %d\n", num[n - 1], num[n / 2], num[0]);
    }else {
        if((num[n / 2 - 1] + num[n / 2]) % 2 == 1)
            printf("%d %.1f %d\n", num[n - 1], (double)((num[n / 2 - 1] + num[n / 2]) / 2.0), num[0]);
        else
            printf("%d %d %d\n", num[n - 1], (num[n / 2 - 1] + num[n / 2]) / 2, num[0]);
    }
    system("pause");
    return 0;
}
  • 小明种苹果
    201909201909tips:题目要求的值比较多,但是题目本身并不难,最多疏果树和编号通过打擂比较即可得到。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,m,t=0,k=1,p=0;
    cin>>n>>m;
    int apple,sum=0,temp=0;
    for(int i=0;i<n;i++){
        cin>>apple;
        for(int j=0;j<m;j++){
            cin>>temp;
            sum+=temp;
        }
        if(abs(sum)>p){
            p=abs(sum);
            k=i+1;
        }
        t+=(apple+sum);
        sum=0;
    }
    cout<<t<<" "<<k<<" "<<p;
    system("pause");
    return 0;
}
  • 报数
    201912tips:for循环代表报数的次数,index代表甲乙丙丁的顺序,甲乙丙丁都报完数,index置零。判断数字中有7可以使用模除法,每次都提取出个位与7比较。PS:甲乙丙丁轮流报数的过程有点类似于排队,排到前面的人报完数再回到队尾等下一波,因此借助数据结构中的队列也可以实现,关于队列的使用和本题的队列实现可以点这里→_→ccf报数-【模拟】队列实现
#include<bits/stdc++.h>
using namespace std;
bool judge(int x){
    bool flag=false;
    if(x%7==0)
        flag=true;
    while (x!=0)
    {
        int temp=x%10;
        if(temp==7)
            flag=true;
        x/=10;
    }
    return flag;
}
int person[4];
int main(){
    int num;
    cin>>num;
    int index=0;
    for(int i=1;i<=num;i++){
        if(index==4)
            index=0;
        if(judge(i)){
            person[index]++;
            num++;
        }
        index++;
    }
    for(int i=0;i<4;i++)
        cout<<person[i]<<endl;
    system("pause");
    return 0;
}
  • 线性分类器
    202006202006202006tips:数学+模拟,本题还是有些复杂的,点在直线上下的位置可以带入方程看结果是大于0还是小于0,同时本题要判断给定的A,B类两点是否在同一侧,对于每一个查询,每次都取出第一个点作为基准,看后面的点在直线的方位和类别,同第一个点对比即可。
#include<bits/stdc++.h>
using namespace std;
struct Point
{
    int x;
    int y;
    char ch;
    int direc;//1:up,2:down
};
int main(){
    int n,m;
    cin>>n>>m;
    Point point[n];
    for(int i=0;i<n;i++){
        cin>>point[i].x>>point[i].y>>point[i].ch;
    }
    int cita0,cita1,cita2;
    int ans;
    for(int i=0;i<m;i++){
        bool flag=true;
        cin>>cita0>>cita1>>cita2;
        ans=cita0+cita1*point[0].x+cita2*point[0].y;
        if(ans>0){
            point[0].direc=1;
        }else{
            point[0].direc=2;
        }
        for(int j=1;j<n;j++){
            ans=cita0+cita1*point[j].x+cita2*point[j].y;
            if(ans>0){
                point[j].direc=1;
            }else{
                point[j].direc=2;
            }
            if(point[j].direc==point[0].direc&&point[j].ch!=point[0].ch){
                flag=false;
                cout<<"No"<<endl;
                break;
            }
            if(point[j].direc!=point[0].direc&&point[j].ch==point[0].ch){
                flag=false;
                cout<<"No"<<endl;
                break;
            }
        }
        if(flag){
            cout<<"Yes"<<endl;
        }
    }
    system("pause");
    return 0;
}
  • 检测点查询
    202009202009tips:数据规模比较小,找距离前三小的可以循环三次,每次都找最小的,然后改成一个很大的数。
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int dis[n];
    int x,y;
    cin>>x>>y;
    int a,b;
    for(int i=0;i<n;i++){
        cin>>a>>b;
        dis[i]=pow((x-a),2)+pow((y-b),2);
    }
    for(int k=0;k<3;k++){
        int min=100000000,index=0;
        for(int i=0;i<n;i++){
            if(dis[i]<min){
                min=dis[i];
                index=i;
            }
        }
        cout<<index+1<<endl;
        dis[index]=100000000;
    }
    return 0;
}

完结撒花( •̀ ω •́ )✧,后续会更新其他题目~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mymel_晗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值