犀牛国际教育旗下指定官方网站~

课程咨询热线 400-656-1680

全网独家!2023 USACO(全国赛)考题&答案解析发布,速领~

发布时间:2023-03-30 10:05:50

编辑:lisa来源:未知浏览:

  USACO美国信息学奥赛,是申请全球计算机专业强校的申请利器,在CS专业众多录取学生的背景履历中都少不了它的身影。每年12月/1月/2月共3场月赛,3月/4月有一场美国公开赛!

  

  2023年USACO美国公开赛,昨日刚比赛结束!

  USACO美国计算机奥赛考题难度如何呢?现在公布考题&答案&解析,各位同学速来领取!

  USACO美国公开赛铜牌3大考题

P1 FEB

P2 MOO LANGUAGE

P3 ROTATE AND SHIFT


 

  USACO OPEN,今年考情如何?

  犀牛USACO竞赛辅导石老师认为:

  本次USACO公开赛铜牌考试还是以暴力搜索和模拟为主,尤其是第二题,需要仔细审题,该题也比较有意思,结合了语言中的语法知识,很多学生很容易在这里犯懵。如果不仔细理解题意,很有可能连题都看不懂。

  本次考试1,2题都有考察到字符串的知识点,如果对与字符串知识点不了解的学生就要多加小心了。

  通常USACO OPEN的考试难度比一般月赛要难一些,并且考试时长为五小时(月赛为4小时),对学生来说是一大考验。

  USACO美国公开赛(铜牌考题解析)

  考题1:

  # P1

  考虑每一段"XFF...FFY"可以产生多少贡献,

  结论是如果X=Y,能产生0,2,4,6,...的贡献,

  否则能产生1,3,5,7,...的贡献,

  对于下面的情况 整体减一可以得到和上面一样的结论。

  再考虑边缘,FF...FFY可以产生多少贡献?

  发现能产生0,1,2,...的贡献,

  于是我们可以分别统计这两种,加上初始答案即可。

  考察知识点: 分类讨论

  考题2:

  # P2

  (分类讨论题)

  首先我们可以去考虑conjunction的数量,这个不能超过.的数量;

  其次考虑单词的数量,这个不能超过conjunction的数量+.的数量;

  然后我们可以通过枚举transitive-verb的数量和intransitive-verb的数量来确定单词的最多个数;

  最后我们依次将单词拼接在一起即可。

  考察知识点: 模拟

  考题3:

  # P3

  考虑一个位置上的值p假如从a[i]变成a[i+1],那么下一次对他进行变化一定是由当前a[i]移动过去造成的,

  所以每个点的运动都具有周期性,每经过t秒,就会往后移动t的距离。

  其中t=a[i+1]-a[i],特殊的,我们令a[k+1]=a[1]+n

  考察知识点 :周期性的发现

  《USACO公开赛铜牌考题》答案

铜牌第一题:
#include <iostream>

using namespace std;

#define rep(i,h,t) for (int i=h;i<=t;i++)

#define dep(i,t,h) for (int i=t;i>=h;i--)

int n;

char s[200010];

bool t[200010];

int main()

{

    scanf("%d",&n);

    scanf("%s",s+1);

    int O=0;

    rep(i,1,n)

      if (s[i]==s[i-1]&&s[i]!='F') O++;

    int Q1=0,Q2=0;

    rep(i,1,n)

    {

        if (s[i]=='F')

        {

            int j=i;

            while (s[j]=='F'&&j<=n) j++;

            j--;

            int num=j-i+1;

            if (i!=1&&j!=n)

            {

                if (s[i-1]==s[j+1]) num++;

                O+=num%2;

                Q1+=num/2;

            } else Q2+=num;

            i=j;

        }

    }

    rep(i,0,Q1)

      rep(j,0,Q2)

        t[i*2+j+O]=1;

    int OO=0;

    rep(i,0,n-1)

      if (t[i]) OO++;

    cout<<OO<<endl;

    rep(i,0,n-1)

      if (t[i]) cout<<i<<endl;

    return 0;

}
铜牌第二题:

#include <iostream>

#include <vector>

#define rep(i,h,t) for (int i=h;i<=t;i++)

#define dep(i,t,h) for (int i=t;i>=h;i--)

using namespace std;

struct nd{

    int a,b,c,d;

    bool operator <(const nd x)const{

        return d>x.d;

    }

};

int main()

{

    int T;

    cin>>T;

    while (T--)

    {

        int n,c,p;

        cin>>n>>c>>p;

        string A,B;

        vector<string> Q1,Q2,Q3,Q4; 

        {

            cin>>A>>B;

            if (B=="noun") Q1.push_back(A);

            if (B=="intransitive-verb") Q2.push_back(A);

            if (B=="transitive-verb") Q3.push_back(A);

            if (B=="conjunction") Q4.push_back(A);

        }

        int maxand=min((int)(Q4.size()),p);

        int maxword=maxand+p;

        vector<nd> ans;

        rep(s1,0,Q3.size()) 

        {

            int s2=min((int)(Q2.size()),maxword-s1);

            s2=min(s2,(int)(Q1.size())-2*s1);

            int s3=min(c,(int)(Q1.size())-2*s1-s2);

            if (!s1) while (s3>0) s3--;

            if (s1<0||s2<0||s3<0) continue;

            ans.push_back({s1,s2,s3,3*s1+2*s2+s3});

        }

        sort(ans.begin(),ans.end());

        int s1=0,s2=0,s3=0,O=0; 

        if (ans.size())

        {

            s1=ans[0].a,s2=ans[0].b,s3=ans[0].c,O=ans[0].d;

        }

        vector<string> Q;         

  rep(i,1,s2)

        {

            Q.push_back(Q1.back()+" "+Q2.back());

            Q1.pop_back(); Q2.pop_back();

        }

        rep(i,1,s1)

        {

            string s=Q1.back()+" "+Q3.back();

            Q1.pop_back(); Q3.pop_back();

            s+=" "+Q1.back();

            Q1.pop_back();

            if (i==1)

            {

                while (s3--)

                {

                    s+=", "+Q1.back();

                    Q1.pop_back();

                }

            }

            Q.push_back(s);

        }

        int round=min((int)(Q4.size()),(int)(Q.size())/2);

        cout<<O+round<<endl;

        string W; 

        rep(i,0,round-1)

        {

          W+=Q[i*2]+" "+Q4.back()+" "+Q[i*2+1]+". ";

          Q4.pop_back();

        }

        for (int i=round*2;i<Q.size();i++)

          W+=Q[i]+". ";

        for (int i=0;i+1<W.length();i++)

          cout<<W[i];

        cout<<endl;

    }

    return 0;

}

铜牌第三题:

#include <iostream>

#include <vector>

using namespace std;

#define rep(i,h,t) for (int i=h;i<=t;i++)

#define dep(i,t,h) for (int i=t;i>=h;i--)

int n,k,t;

int main()

{

    cin>>n>>k>>t;

    vector<int> a(n+10),L(n+10),R(n+10),p(n+10);

    vector<bool> h(n+10);

    rep(i,1,k) cin>>a[i];

    a[k+1]=a[1]+n;

    rep(i,1,k) h[a[i]]=1;

    rep(i,0,n-1)

      if (h[i]) L[i]=i; else L[i]=L[i-1];

    rep(i,1,k) R[a[i]]=a[i+1]-a[i];

    rep(i,0,n-1)

    {

        int tim=t-i+L[i];

        int round=tim/R[L[i]];

        if (tim%R[L[i]]!=0) round++;

        p[(i+round*R[L[i]])%n]=i;

    }

    rep(i,0,n-2) cout<<p[i]<<" ";

    cout<<p[n-1];

    return 0;

}
 

  重磅福利限时领取

  2023年USACO美国公开赛

  各级别竞赛考题及解析,在线咨询即可领取


 

USACO比赛结束,犀牛重磅讲座来袭

ChatGPT4.0降临,学CS刻不容缓
更多计算机赛事准备和问题探讨
在线预约4月7日韩婷老师的精彩分享

相关标签:
TOP