美文网首页
2019信息学奥赛试题和答案(原noip)

2019信息学奥赛试题和答案(原noip)

作者: Mack老师 | 来源:发表于2020-03-10 18:03 被阅读0次

    信息学奥赛作为传统五大学科竞赛,具有很高的含金量,和一定的难度,但是经过系统的学习,拿下奖项并不难,我们来看看19年的信息学奥赛都考了哪些知识吧。

    还不了解信息学的同学可以翻我以前的文章,或者加文后公众号联系我喔!

    恭喜J组同学完成了一项赛事挑战,这里把J组的4道编程题代码梳理一下,帮助同学们查漏补缺。

    第一题:数字游戏

    该题主要考察字符串的定义和使用,考察选手基本的C++语法知识

    参考代码:

    第二题:公交换乘

    本题属于模拟类,考察选手C++基本语法知识

    参考代码:

    第三题:纪念品

    纪念品价格每天都波动,通过手中现有金币数购买尽可能多的纪念品,T天内卖出获得最多金币。可以使用背包。

    参考代码:

    第四题:加工零件

    参考代码(有点长,考察最短路径算法):

    #include

    #include

    #include

    #include

    using namespace std;

    const int MAXN=1e5+5;

    const int MAXM=2e5+5;

    int n,m,que;

    int head[MAXN],v[MAXM],next[MAXM],cnt=0;

    int dis[MAXN][2];

    void add_edge(int s,int t){

    v[++cnt]=t;

    next[cnt]=head[s];

    head[s]=cnt;

    }

    void spfa(){

    //0表示偶数

    //1表示奇数

    memset(dis,0x3f,sizeof(dis));

    dis[1][0]=0;//起始路径0

    queue q;//队列实现

    q.push(1);

    while(!q.empty()){

    int cur=q.front();

    q.pop();

    for(int i=head[cur];i;i=next[i]){

    int np=v[i];

    if(dis[cur][0]+1

    q.push(np);

    dis[np][1]=min(dis[np][1],dis[cur][0]+1);

    dis[np][0]=min(dis[np][0],dis[cur][1]+1);

    }

    }

    }

    int main(){

    scanf("%d%d%d",&n,&m,&que);

    for(int i=0;i

    int u,v;

    scanf("%d%d",&u,&v);

    add_edge(u,v);

    add_edge(v,u);

    }

    spfa();

    while(que--){

    int a,l;

    scanf("%d%d",&a,&l);

    if(head[1]&&dis[a][l&1]<=l)printf("Yes\n");

    else printf("No\n");

    }

    return 0;

    }

    每个孩子都有机会学习计算机

    相关文章

      网友评论

          本文标题:2019信息学奥赛试题和答案(原noip)

          本文链接:https://www.haomeiwen.com/subject/fdjgdhtx.html