2020年青少年信息学科普日活动小学组试题

1、点积运算(dot)

点积在数学中,又称数量积,它是欧几里得空间的标准内积,在机器学习和人工智能中具有非常广泛的应用。二维空间内两个向量的点积定义为向量中对应各维坐标的乘积和。例如,向量 a=(a1,a2),向量 b=(b1,b2),则向量 a 和向

量 b 的点积为:a1*b1+a2*b2。请同学们计算二维空间内两个向量的点积。

输入:输入数据共 2 行,第一行有两个用空格分隔的整数,表示第一个向量,第二行有两个用空格分隔的整数,表示第二个向量。

输出:共 1 行一个整数,为两个向量的点积和。

样例 1:

输入:(dot.in)

  1. 4

  1. 5

输出:(dot.out)

26

数据范围:1≤a1,a2,b1,b2≤100000

#include<bits/stdc++.h>
using namespace std;
long long a1,b1,a2,b2;
signed main(){
    freopen("dot.in","r",stdin);
    freopen("dot.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>a1>>a2>>b1>>b2;
    cout<<(a1*b1)+(a2*b2);
    return 0;
}

直接算

2、成绩统计(score)

期末考试结束了,学校已批改完所有试卷,已知某年级共有 n 位学生和他们对应的成绩。老师们想知道这个年级学生成绩的分布情况,以便下学期更好的开展教学,因此现在需要统计一些数据如下:

  1. 全校最低分、最高分的成绩及人数;

  1. 同分最多的成绩和人数,如果相同,依次由低分到高分输出;

  1. 分值 p 和 q 之间(包含 p 和 q)人数。

请同学们编程帮忙统计吧。

输入:输入数据共 3 行。第一行一个整数 n,表示学校某年级总人数,第二行共有 n 个由空格分隔的正整数,表示每一位学生成绩。第三行共有 2 个由空格分隔的正整数 p 和 q。

输出:共 4 行,第一行 2 个由空格分隔的正整数,对应最低的成绩及人数,第二行 2 个由空格分隔的正整数,对应最高的成绩及人数,第三行多个由空格分隔的正整数,对应多个相同分数最多的成绩及人数。第 4 行 1 个正整数,对应成绩 p 和 q 之间人数。

样例:

输入:(score.in)

11

80 85 80 78 90 95 95 80 98 78 95

85 95

输出:(score.out)

78 2

98 1

80 3 95 3

5

数据范围:1≤学生人数 n≤10000,0≤每个学生成绩≤500

#include<bits/stdc++.h>
using namespace std;
int n,a[10009],p,q,b[509],ans=0,xx=0,xi=0,minn=2e9,maxn=-2e9;
signed main(){
    freopen("score.in","r",stdin);
    freopen("score.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[a[i]]++;
        xx=max(b[a[i]],xx);
        minn=min(minn,a[i]);
        maxn=max(maxn,a[i]);
    }
    cin>>p>>q;
    cout<<minn<<" "<<b[minn]<<endl<<maxn<<" "<<b[maxn]<<endl;
    for(int i=p;i<=q;i++) ans+=b[i];
    for(int i=0;i<=501;i++){
        if(xx==b[i]) cout<<i<<" "<<xx<<" ";
    }
    cout<<endl<<ans;
    return 0;
}

大模拟精神

3、出队游戏(queue)

秋冬季阳关明媚的上午,老师带领同学们在做一个游戏,首先同学们排成一列,然后从 1 开始依次给同学们一个编号,如果有 5 位同学,他们的编号依次为1、2、3、4、5。游戏的规则如下:

①从队头开始依次按一、二、一、二、……报数,凡是报到数为二的出来;

②剩余的同学依次靠拢重新排成一列,从队头开始依次按一、二、三、一、二、三、……报数,凡是报到数为三的出来;

③重复第 ①、②,直到剩余的人数不超过 3 为止。

输入:输入数据只有一行一个正整数 n,表示学生人数。

输出:一行由空格分隔的若干正整数。

样例 1:

输入:(queue.in)

5

输出:(queue.out)

1 3 5

样例 2:

输入:(queue.in)

9

输出:(queue.out)

1 7

数据范围:4≤n≤10000

#include<bits/stdc++.h>
using namespace std;
bool a[10100];
int n,num=0,s;
int main() {
    cin>>n;
    s=n;
    while(s>3) {
        num=0;
        for(int i=1;i<=n;i++){
            if(a[i]==0){
                num++;
                if(num%2==0){
                    a[i]=1;
                    s--;
                }
            }
        }
        if(s<=3) break;
        num=0;
        for(int i=1;i<=n;i++){
            if(!a[i]){
                num++;
                if(num%3==0){
                    a[i]=true;
                    s--;
                }
            }
        }
    }
    for(int i=1; i<=n; i++)
        if(!a[i]) cout<<i<<" ";
    return 0;
}

约瑟夫环

4、盲比多少游戏(game)

小强和小明两位小朋友在玩一个盲比多少的游戏,游戏规则非常简单:每次手握一定数量的小弹珠出拳,谁手中的小弹珠多,谁就算赢,赢家不仅可以获得输家本次出拳的小弹珠,还可以得到 50 积分的奖励,输家则被扣除 50 分奖励;如果弹珠数量一样,则不计积分。经过若干次的出拳,最后赢家就可以得到一定的积分。假设最后赢家是小强,你可以通过安排出拳时手握弹珠数量,使小强获得最多积分。开始时两人积分都为 0。

输入:共 3 行,第一行一个正整数 n(1≤n≤1000),表示总共出拳次数,第二行有 n 个由空格分隔的正整数,表示小强每次出拳时手握的弹珠数,第三行有 n 个由空格分隔的正整数,表示小明出拳时手握弹珠数。注意出拳时手握弹珠数不一定按照给出的顺序进行。

输出:共 1 行一个整数,表示小强可获得的最大积分。

样例 1:

输入:(game.in)

3

  1. 5 3

  1. 4 6

输出:(game.out)

50

样例解释:共出拳 3 次,第一次小强手握 1 个弹珠,小明手握 6 个弹珠,小强输;第二次小强手握 5 个弹珠,小明手握 4 个弹珠,小强赢;第三次小强手握个弹珠,小明手握 2 个弹珠,小强赢;小强两赢一输,总积分为 50 分。

#include<bits/stdc++.h>
using namespace std;
int n, a[1010], b[1010];
int win=0;
bool cmp(int a, int b) {
    return a>b;
}
int main() {
    freopen("game.in","r",stdin);
    freopen("game.out","w",stdout);
    cin>>n;
    for(int i=0; i<n; i++) cin>>a[i];
    for(int i=0; i<n; i++) cin>>b[i];
    sort(a, a+n, cmp);
    sort(b, b+n, cmp);
    int qs=0, qe=n-1;
    int ms=0, me=n-1;
    while(qs<=qe && ms<=me) {
        if(a[qs]>b[ms]) {
            win++;
            qs++;
            ms++;
        }
        else if(a[qe]>b[me]) {
            win++;
            qe--;
            me--;
        }
        else {
            if(a[qe]<b[ms]) win--;
            qe--;
            ms++;
        }
    }
    cout<<win*50;
    return 0;
}

田忌赛马的改编版

[补充] 最长最短单词(words.cpp)

【题目描述】 输入 1 行句子(不多于 200 个单词,每个单词长度不超过 100),只包含字母、空格和逗号。单词由至少一个 连续的字母构成,空格和逗号都是单词间的间隔。 试输出第 1 个最长的单词和第 1 个最短单词。 【输入】 一行句子。 【输出】 第 1 行,第一个最长的单词。 第 2 行,第一个最短的单词。 【输入样例】 I am studying Programming language C in Peking University 【输出样例】 Programming I 【提示】 提示: 如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。

#include<bits/stdc++.h>
using namespace std;
string s;
int sum,minn,maxn=2e9,mp,mip;
int main(){
    freopen("words.in","r",stdin);
    freopen("words.out","w",stdout);
    getline(cin,s);
    int len=s.size();
    for(int i=0;i<len;i++){
        if(s[i]!=' '&&s[i]!=',') sum++;
        else if(sum>0){
            if(sum>minn){
                minn=sum;
                mp=i-sum;
            }
            if(sum<maxn){
                maxn=sum;
                mip=i-sum;
            }
            sum=0;
        }
    }
    for(int i=mp;i<mp+minn;i++) cout<<s[i];
    cout<<"\n";
    for(int i=mip;i<mip+maxn;i++) cout<<s[i];
    return 0;
}

字符串模拟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值