ccf-csp:201809

啊啊啊啊!!!!!我!太!兴!奋!了!考前的所有模拟中第一次上400!!!(也可能是这一次的csp题目比较简单)但对我来说!还是史诗性的进步!!!!这对后天即将要考csp的我是很大的鼓舞!!!!下面是我这次模拟的题目以及代码,先放上去留个纪念!!!虽然还有很多可以优化和拿分的空间,但考试总会有遗憾,已经很满意了呜呜呜~最后dby加油!!!你下次csp一定可以的!!!!

卖菜题目链接

代码如下:

#include <iostream>

using namespace std;
int a[1010];
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        if(i==1) cout<<(a[1]+a[2])/2<<" ";
        else if(i==n) cout<<(a[n-1]+a[n])/2<<" ";
        else cout<<(a[i-1]+a[i]+a[i+1])/3<<" ";
    }
    return 0;
}

买菜题目链接

代码如下:

#include <iostream>

using namespace std;
const int N=1e6+10;
int a[N],b[N];
int n;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        int l,r;
        cin>>l>>r;
        fill(a+l,a+r,1);
    }
    for(int i=1;i<=n;i++)
    {
        int l,r;
        cin>>l>>r;
        fill(b+l,b+r,1);
    }
    int ans=0;
    for(int i=1;i<=1e6;i++)
        if(a[i]&&b[i]) ans++;
    cout<<ans;
    return 0;
}

元素选择器题目链接

代码如下:

#include <bits/stdc++.h>

using namespace std;
const int N=110;

struct node{
vector<int>child;
string di,id;
}a[N];
int st[N];
int n,m,cnt;
vector<int> ans;
string s[N],s1[N];
string qu,qu1[N];
int kin[N];
void dfs(int fa,int u,int num)
{
    if(u==n+1) return;
    for(int i=u;i<=n;i++)
    {
        if(st[i]) continue;

        int nu=0;
        for(int j=0;j<s[u].size();j+=2)
        {
            if(s[i][j]=='.')nu++;
            else break;
        }
        if(nu==num)
        {
            st[i]=1;
            if(fa>=1) a[fa].child.push_back(i);
            a[i].di=s[i].substr(nu*2);
            a[i].id=s1[i];
            dfs(i,i+1,nu+1);
        }
        else if(nu>num) dfs(u,i,nu);
        else return;

    }
}
void dfs1(int u,int flag)
{
    for(int i=0;i<a[u].child.size();i++)
    {
        int v=a[u].child[i];
        if(flag<cnt-1)
        {
            if((kin[flag]==1&&a[v].id==qu1[flag])||(kin[flag]==2&&a[v].di==qu1[flag])) dfs1(v,flag+1);
            else dfs1(v,flag);
        }
        else
        {
            if((kin[flag]==1&&a[v].id==qu1[flag])||(kin[flag]==2&&a[v].di==qu1[flag])) ans.push_back(v);
            dfs1(v,flag);
        }
    }
}
void func1()
{
    for(int i=0;i<qu.size();i++)
    {
        if(qu[i]>='a') qu[i]=qu[i]-32;
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i].di==qu)
        {
            ans.push_back(i);
        }
    }
    cout<<ans.size()<<" ";
    for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
    cout<<endl;
    ans.clear();
}
void func2()
{
    qu=qu.substr(1);
    for(int i=1;i<=n;i++)
    {
        if(a[i].id==qu) ans.push_back(i);
    }
    cout<<ans.size()<<" ";
    for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
    cout<<endl;
    ans.clear();
}
void func3()
{
    for(int i=0;i<cnt;i++)
    {
        if(qu1[i][0]=='#')
        {
            qu1[i]=qu1[i].substr(1);
            kin[i]=1;
        }
        else
        {
            for(int j=0;j<qu1[i].size();j++)
            {
                if(qu1[i][j]>='a') qu1[i][j]=qu1[i][j]-32;
            }
            kin[i]=2;
        }
    }
    if(kin[0]==1)
    {
        if(a[1].id==qu1[0]) dfs1(1,1);
        else dfs1(1,0);
    }
    else
    {
        if(a[1].di==qu1[0]) dfs1(1,1);
        else dfs1(1,0);
    }
    cout<<ans.size()<<" ";
    for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
    cout<<endl;
    ans.clear();
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>s[i];
        for(int j=0;j<=s[i].size();j++)//49 17
        {
            if(s[i][j]>='a') s[i][j]=s[i][j]-32;
        }
        if(cin.get()!='\n')
        {
            string ss;
            cin>>ss;
            s1[i]=ss.substr(1);
        }
    }

    dfs(-1,1,0);
    //cout<<a[1].di<<endl;
    while(m--)
    {
        cin>>qu;
        if(cin.get()!='\n')
        {
            cnt=1;
            while(cin>>qu1[cnt++])
            {
                if(cin.get()=='\n') break;
            }
            qu1[0]=qu;
            func3();
            continue;
        }
        if(qu[0]=='#')func2();
        else func1();
    }
    return 0;
}

再卖菜题目链接

代码如下:

#include <iostream>

using namespace std;
int a[310],b[310];
int n;
bool dfs(int u)
{
    if(u==n)
    {
        for(int i=max((a[n]*2-b[u-1]),1);(i+b[u-1])/2<=a[n];i++)
        {
            b[u]=i;
            if((b[u-2]+b[u-1]+i)/3==a[u-1])
                return true;
        }
        return false;
    }
    if(u==1)
    {
        for(int i=1;i/2<a[1]&&(i+2)/3<=a[2];i++)
        {

            b[u]=i;
            if(dfs(u+1)) return true;
        }
    }
    else if(u==2)
    {
        for(int i=max(a[1]*2-b[1],1);(b[u-1]+i+1)/3<=a[u]&&(i+2)/3<=a[3];i++)
        {
            if(((i+b[1])/2==a[1]))
            {
                b[u]=i;
                if(dfs(u+1)) return true;
            }
        }
    }
    else if(u==n-1)
    {
        for(int i=max(a[u-1]*3-b[u-1]-b[u-2],1);(b[u-1]+i+1)/3<=a[u]&&(i+1)/2<=a[u+1];i++)
        {
            if(((i+b[u-1]+b[u-2])/3==a[u-1]))
            {
                b[u]=i;
                if(dfs(u+1)) return true;
            }
        }
    }
    else
    {
        for(int i=max(a[u-1]*3-b[u-1]-b[u-2],1);(b[u-1]+i+1)/3<=a[u]&&(i+2)/3<=a[u+1];i++)
        {
            if(((i+b[u-1]+b[u-2])/3==a[u-1]))
            {
                b[u]=i;
                if(dfs(u+1)) return true;
            }
        }
    }
    return false;
}
int main()
{
    cin>>n;

    for(int i=1;i<=n;i++) cin>>a[i];
    if(n<=2)
    {
        cout<<"1 "<<(a[1]*2)-1;
        return 0;
    }
    dfs(1);
    for(int i=1;i<=n;i++) cout<<b[i]<<" ";
    return 0;
}

线性递推式题目链接

emmm这个只有20分,还有优化的空间,可是模拟的时间不够了~~~日后会再来看的!!

代码如下:

#include <iostream>
#define ll long long
using namespace std;
const int mod=998244353;
const int M=1e5+10;
ll k[M],b[M];
ll l,r;
int m;
int main()
{
    cin>>m>>l>>r;
    for(int i=1;i<=m;i++) cin>>k[i];
    b[0]=1;
    for(int i=1;i<=r;i++)
    {
        ll ans=0;
        for(int j=1;j<=min(i,m);j++)
        {
            ans=(ans+(k[j]*b[i-j]%mod))%mod;
        }
        b[i]=ans;
    }
    for(int i=l;i<=r;i++)cout<<b[i]<<endl;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值