ccf-csp:201803

今天模拟的是2018年三月份的csp,这次题目也是比较简单(要是现在的csp还是以前的难度就好了~~~~),前两题不说了很简单,第三题是一个模拟题,难点在于字符串的处理,这道题我拿了80分,时间到了实在是改不出来了~~~,第四题就是一个简单地dfs就出来了,第五题我拿了暴力的40分,一共拿了100+100+80+100+40=420~~~~~

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ruh5Zyw6YO95piv5YWt5L6_5aOr5LuW5Y205oqs5aS055yL5ZCR5LqG5pyI5Lqu,size_12,color_FFFFFF,t_70,g_se,x_16

通过这几次模拟考试发现,考场上选择做题的顺序以及考试时候的心态真的十分重要!!!还有考试的细心程度!!!!其实四个小时并不算短,因此如果一道题卡了一会也不要慌,当下最紧要的是做明智的决定,是决定换一道题还是在思考一会,千万记得不要被沉没成本所影响!!!!

最后贴一下这次模拟考试的题目和代码

201803-1跳一跳

代码如下:

#include <iostream>

using namespace std;

int ans,num;
int main()
{
    int a;
    while(cin>>a)
    {
        if(a==0) break;
        if(a==1) num=1;
        else if(a==2)
        {
            if(num==1) num=2;
            else num+=2;
        }
        ans+=num;
    }
    cout<<ans;
    return 0;
}
201803-2碰撞的小球

代码如下:

#include <bits/stdc++.h>

using namespace std;

int n,l,t;
struct node{
int id,pos;
} a[110];
int b[110],v[110];
bool cmp(node c,node d)
{
    return c.pos<d.pos;
}
int main()
{
    cin>>n>>l>>t;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i].pos;
        a[i].id=i;
    }
    sort(a+1,a+n+1,cmp);
    a[n+1].pos=l,a[0].pos=0;
    fill(v+1,v+n+1,1);
    for(int i=1;i<=n;i++) b[a[i].id]=i;
    for(int i=0;i<=t;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(i==0)
            {
                if(a[j].pos==a[j-1].pos||a[j].pos==a[j+1].pos) v[j]=-v[j];
                continue;
            }
            a[j].pos+=v[j];
            if(a[j].pos==a[j-1].pos||a[j].pos==(a[j+1].pos+v[j+1]))
            {
                v[j]=-v[j];
                //cout<<"sudu  "<<j<<endl;
            }
        }
    }
    for(int i=1;i<=n;i++) cout<<a[b[i]].pos<<" ";
    return 0;
}
201803-3URL映射

这个只拿了80分,还有些细节没注意到~~~

代码如下:

#include <bits/stdc++.h>

using namespace std;

string s[110],na[110];
vector<string> ans;
string ss;
int n,m,cnt;
bool func1(string sss)
{
    int k=cnt;
    if(sss=="<int>")
    {
        int flag=0;
        for(;cnt<ss.size();cnt++)
        {
            if(ss[cnt]=='/') break;
            if(ss[cnt]<'0'||ss[cnt]>'9')
            {
                flag=0;break;
            }
            else flag=1;
        }
        cnt++;
        if(!flag) return false;
        else
        {
            for(int i=k;i<cnt;i++)
            {
                if(ss[i]!='0')
                {
                    ans.push_back(ss.substr(i,cnt-i-1));
                    break;
                }
            }
             return true;
        }
    }
    if(sss=="<str>")
    {
        int flag=0;
        for(;cnt<ss.size();cnt++)
        {
            if(ss[cnt]=='/') break;
            flag=1;
        }
        cnt++;

        if(!flag) return false;
        else
        {
            ans.push_back(ss.substr(k,cnt-k-1));
            return true;
        }
    }
    if(sss=="<path>")
    {
        if(cnt<ss.size())
        {
            ans.push_back(ss.substr(cnt));
            cnt=ss.size();
            return true;
        }
        else return false;
    }
    string tem="";
    for(int i=0;i<sss.size();i++)
    {
        if(ss[cnt]==sss[i]) cnt++;
        else
        {
            return false;
        }
    }

    if(cnt<ss.size()&&ss[cnt]!='/') return false;
    else
    {
        cnt++;
        return true;
    }
}

void func()
{
    int flag=0;

    for(int i=1;i<=n;i++)
    {
        int k=1,ll=s[i].size();
        cnt=1;
        for(int j=1;j<ll;j++)
        {
            if(s[i][j]!='/')
            {
                if(cnt>=ss.size()) break;

            }
            if(s[i][j]=='/')
            {
                string s1=s[i].substr(k,j-k);
                //cout<<s1<<endl;
                k=j+1;
                if(!func1(s1)) break;
            }
            if(j==ll-1)
            {
                if(s[i][j]!='/')
                {
                    string s1=s[i].substr(k);
                    if(!func1(s1)) break;
                    else
                    {
                        if(ss[ss.size()-1]!='/') flag=i;
                    }
                }
                else
                {
                    if(ss[ss.size()-1]=='/')flag=i;
                }
            }
        }
        if(cnt<ss.size()) flag=0;
        if(flag) break;
        ans.clear();
    }
    if(flag)
    {
        cout<<na[flag]<<" ";
        for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
        cout<<endl;
    }
    else cout<<404<<endl;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>s[i]>>na[i];
    while(m--)
    {
        cin>>ss;
        int flag=1;
        for(int i=0;i<ss.size();i++)
        {
            if(ss[i]=='?')
            {
                flag=0;
                break;
            }

        }
        if(!flag)
        {
            cout<<404<<endl;
            continue;
        }
        func();
    }
    return 0;
}
/*
1 4
/static/<path> static_serve
/static/js/jquery.js
/articles/1985/09/aloha/
/articles/2004/

/articles/hello/

*/
201803-4棋局评估

代码如下:

#include <iostream>

using namespace std;
int g[4][4];
int t;
bool check(int x)
{
    if(g[1][1]==x&&g[2][2]==x&&g[3][3]==x) return true;
    if(g[3][1]==x&&g[2][2]==x&&g[1][3]==x) return true;
    for(int i=1;i<=3;i++)
    {
        if(g[i][1]==x&&g[i][2]==x&&g[i][3]==x) return true;
        if(g[1][i]==x&&g[2][i]==x&&g[3][i]==x) return true;
    }
    return false;
}
int score(int x)
{
    int res=1;
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(!g[i][j]) res++;
        }
    }
    if(x==1) return res;
    else return -res;
}
int dfs(int x)
{
    if(check(1))return score(1);
    else if(check(2)) return score(2);
    else if(score(1)==1) return 0;
    int maxx=-10,minn=10;
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(g[i][j])continue;
            if(x==1)
            {
                g[i][j]=1;
                maxx=max(maxx,dfs(2));
                g[i][j]=0;
            }
            else
            {
                g[i][j]=2;
                minn=min(minn,dfs(1));
                g[i][j]=0;
            }

        }
    }
    if(x==1) return maxx;
    else return minn;
}
int main()
{
    cin>>t;
    while(t--)
    {
        for(int i=1;i<=3;i++)
        {
            for(int j=1;j<=3;j++)
            {
                cin>>g[i][j];
            }
        }
        cout<<dfs(1)<<endl;;
    }
    return 0;
}
01803-5次求和

关于第五题我想说以前的csp是真的香啊,暴力破解能拿40分!!!!对比上一次的csp(2021年 12月份的)第五题暴力12分,,,不得不说好怀念以前的csp啊啊啊~~~~

代码如下:

#include <bits/stdc++.h>

using namespace std;

#define ll unsigned long long
const int N=1e5+10;
const int mod=1e9+7;
ll a[N];
vector<int>adj[N];
vector<int>ans;
int ans1[N];
int t,n,m,l,r;
int u0,v0;
ll d;
bool dfs(int fa,int u)
{
    if(u==v0) return true;
    for(int i=0;i<adj[u].size();i++)
    {
        int v=adj[u][i];
        if(v==fa)continue;
        if(dfs(u,v))
        {
            ans.push_back(v);
            return true;
        }
    }
    return false;
}
void func()
{
    for(int i=0;i<ans.size();i++)
    {
        int u=ans[i];
        a[u]=(a[u]+d)%mod;
    }
    ll anss=0;
    for(int i=1;i<=n;i++)
    {
        anss=(anss+ans1[i]*a[i]%mod)%mod;
    }
    cout<<anss<<endl;
}
void dfs1(int fa,int s,int u,int num)
{
    if(num>=l&&num<=r&&s<=u)
    {
        for(int i=0;i<ans.size();i++)
        {
            ans1[ans[i]]++;
        }
    }
    if(num>=r) return;
    for(int i=0;i<adj[u].size();i++)
    {
        int v=adj[u][i];
        if(v==fa) continue;
        ans.push_back(v);
        dfs1(u,s,v,num+1);
        ans.pop_back();
    }
}
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>l>>r;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=2;i<=n;i++)
        {
            int u1;
            cin>>u1;
            adj[u1].push_back(i);
            adj[i].push_back(u1);
        }
        for(int i=1;i<=n;i++)
        {
            ans.clear();
            ans.push_back(i);
            dfs1(-1,i,i,1);
        }
        while(m--)
        {
            cin>>u0>>v0>>d;
            ans.clear();
            ans.push_back(u0);
            dfs(-1,u0);
            func();

        }
        fill(ans1,ans1+n+1,0);
        for(int i=1;i<=n;i++) adj[i].clear();
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值