CSP认证考试真题,更新中....

荒凉一梦 提交于 2020-02-08 22:33:24

为啥只有前两道题,因为蒟蒻只能写出来前两题(小声BB)
题目陆续补充中…

已注册CCF用户点击题目就可以做题,提交代码啦

CSP 201912-1 报数

思路: 水题,模拟即可
代码:

#include<bits/stdc++.h>
using namespace std;

bool fun(int x)
{
    if(x%7==0)
    {
        return true;
    }
    int t=0;
    while(x)
    {
        t=x%10;
        if(t==7)
        {
            return true;
        }
        x/=10;
    }
    return false;
}
int main()
{
    int n;
    cin>>n;
    int s[5];
    memset(s,0,sizeof(s));
    int cnt=1;
    int i=1;
    int j=1;
    while(cnt<=n)
    {
    	if(fun(j))
        {
            s[i]++;
        }
        else
        {
            cnt++;
        }
        j++;
        i++;
        if(i==5)
            i=1;
    }
    for(i=1;i<=4;i++)
    {
        cout<<s[i]<<"\n";
	}	
    return 0;
}

CSP 201912-2 回收站选址

思路: 使用STL库中的set进行查找,将每一个点的分数存入数组即可
代码:

#include<bits/stdc++.h>
#define repn(n) for(int i=1;i<=n;i++)
#define rep(n) for(int i=0;i<n;i++)
#define ll long long
using namespace std;
const int maxn=1e4;
int s[6];
struct Point{
    int x;
    int y;
}p[maxn];
set<pair<int,int> > vis;
bool fnd(int x,int y)
{
    if(vis.count(pair<int,int>(x-1,y))==0) 
        return false;
    if(vis.count(pair<int,int>(x+1,y))==0) 
        return false;
    if(vis.count(pair<int,int>(x,y+1))==0) 
        return false;
    if(vis.count(pair<int,int>(x,y-1))==0) 
        return false;
    return true;
}
int getmark(int x,int y)
{
    int ans=0;
    if(vis.count(pair<int,int>(x+1,y+1))) 
        ans++;
    if(vis.count(pair<int,int>(x+1,y-1))) 
        ans++;
    if(vis.count(pair<int,int>(x-1,y+1))) 
        ans++;
    if(vis.count(pair<int,int>(x-1,y-1)))
        ans++;
    return ans;
}
int main()
{
    memset(s,0,sizeof(s));
    int n;
    cin>>n;
    rep(n)
    {
        cin>>p[i].x>>p[i].y;
        vis.insert(pair<int,int>(p[i].x,p[i].y));
    }
    rep(n)
    {
        if(fnd(p[i].x,p[i].y))
        {
            s[getmark(p[i].x,p[i].y)]++;
        }
    }
    n=5;
    rep(n)
    {
        cout<<s[i]<<endl;
    }
    return 0;
} 

CSP 201903-2 24点

思路:使用栈来储存数字,由于乘和除的优先级较高,计算后再压入栈,最后将栈内所有元素加起来即可
ps:有一个小窍门,可以将 (-) 转换为 +(-)
代码:

#include<bits/stdc++.h>
#define repn(n) for(int i=1;i<=n;i++)
#define rep(n) for(int i=0;i<n;i++)
#define ll long long
using namespace std;
const int maxn=1e3+5;
stack<int> num;
void fun(string s)
{
    int n,tp;
    n=s.size();
    rep(n)
    {
        if(s[i]>='0'&&s[i]<='9')
        {
            num.push(s[i]-'0');
        }
        else if(s[i]=='+'||s[i]=='-')
        {
            if(s[i]=='-')
            {
                tp=-1*(s[i+1]-'0');
                num.push(tp);
                i++;
            }
        }
        else if(s[i]=='x'||s[i]=='/')
        {
            tp=num.top();
            num.pop();
            if(s[i]=='x')
            {
                tp=tp*(s[i+1]-'0');
                num.push(tp);
                i++;
            }
            else
            {
                tp=tp/(s[i+1]-'0');
                num.push(tp);
                i++;
            }
        }
    }
    int ans=0;
    while(!num.empty())
    {
        ans=ans+num.top();
        num.pop();
    }
    if(ans==24)
        cout<<"Yes\n";
    else
        cout<<"No\n";
}
int main()
{

    int n;
    cin>>n;
    while(n--)
    {
        string s;
        cin>>s;
        fun(s);
    }
}

CSP 201809-1 卖菜

思路:这种题需要啥思路??直接写 QAQ
代码:

#include<stdio.h>
#include<math.h> 
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
	int n,i;
	int s[1002];
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&s[i]);
	}
	for(i=1;i<=n;i++)
	{
		int t;
		if(i==1)
		{
			t=(int)((s[1]+s[2])/2);
			printf("%d",t);
		}
		else if(i==n)
		{
			t=(int)((s[i-1]+s[i])/2);
			printf(" %d\n",t);
		}
		else
		{
			t=(int)((s[i]+s[i-1]+s[i+1])/3);
			printf(" %d",t);
		}
	}
	return 0;
}

CSP 201809-2 买菜

思路: 将甲的每个时间端的开始时间存到数组里面,再利用二分查找乙和甲的重叠时间,就是结果…
代码:

#include<bits/stdc++.h>
#define repn(n) for(int i=1;i<=n;i++)
#define rep(n) for(int i=0;i<n;i++)
#define pb push_back
#define ll long long
using namespace std;
vector<int> vis;
bool fnd(int x)
{
    int h=vis.size()-1,l=0;
    while(l<=h)
    {
        int mid=(l+h)/2;
        if(vis[mid]==x)
            return true;
        else if(vis[mid]<x)
            l=mid+1;
        else
            h=mid-1;
    }
    return false;
}
void getnum(int n)
{
    int x,y;
    repn(n)
    {
        cin>>x>>y;
        for(int j=x;j<y;j++)
            vis.pb(j);
    }
}
int getscore(int n)
{
    int x,y;
    int ans=0;
    repn(n)
    {
        cin>>x>>y;
        for(int j=x;j<y;j++)
        {
            if(fnd(j))
                ans++;
        }
    }
    return ans;
}
int main()
{
    int n;
    cin>>n;
    getnum(n);/
    int res=getscore(n);
    cout<<res<<endl;
    return 0;
}


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!