202401卓裂学院转专业-上机测试

7-1 一起生日

作者 刘春英 单位 杭州电子科技大学

杭州电子科技大学附属小学有个优秀的传统,每隔一段时间,会给班里的近期过生日的同学举办一场生日 Party!老师会给出一个生日起止日期来确定生日 Party 的小寿星。

输入格式:

输入包含多组测试数据。

每组数据第一行,包括一个正整数 \(N(0 <= N <= 40)\),表示某个班的学生人数,接下来有 \(N\) 行数据,每行包含一个同学的姓名,以及出生年、月、日。

每组数据的最后一行,包括 \(4\) 个正整数 \(m1、d1、m2、d2\),分别表示生日 Party 的小寿星生日起止月和日(包含),其中 \(m1 <= m2\)

输出格式:

每组数据输出一行小寿星的名单(按照原名单的次序),每个名字后面跟一个空格。

输入样例:

5
Tom 2009 10 15
Kate 2010 7 20
David 2010 6 30
Kevin 2009 7 3
Sarah 2010 3 8
7 1 7 30

输出样例:

Kate Kevin 

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;
struct stu{
    string name;
    int m;
    int d;
};

int main(){
    int n;
    while(cin>>n){
        int temp;
        stu s[n];
        for(int i=0;i<n;i++){
            cin>>s[i].name>>temp>>s[i].m>>s[i].d;
        }
        int m1,m2,d1,d2;
        cin>>m1>>d1>>m2>>d2;
        vector<string> v;
        if(m1==m2){
            for(auto &i:s){
                if(i.m==m1 && i.d>=d1 && i.d<=d2){
                    v.push_back(i.name);
                }
            }
        }else{
            for(auto &i:s){
                if(i.m>m1 && i.m<m2){
                    v.push_back(i.name);
                }else if(i.m==m1 && i.d>=d1){
                    v.push_back(i.name);
                }else if(i.m==m2 && i.d<=d2){
                    v.push_back(i.name);
                }
            }
        }
        for(auto &i:v){
            cout<<i<<" ";
        }
        cout<<endl;
    }
    
    return 0;
}

7-2 素数输出

作者 刘春英 单位 杭州电子科技大学

给定一个正整数 \(N\),请输出小于等于 \(N\) 的素数个数。

输入格式:

输入包含多组测试数据,每组数据占一行,包括一个正整数 \(N(2<=N<=100000)\)

输出格式:

对于每组数据给定的 \(N\),请输出一个正整数,表示小于等于 \(N\) 的素数个数,每组输出占一行。

输入样例:

10
20

输出样例:

4
8

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;
bool isprime(int n){
    if(n<=1)    return false;
    if(n==2)    return true;
    if(n%2==0)  return false;
    for(int i=3;i<sqrt(n)+1;i++){
        if(n%i==0)  return false;
    }
    return true;
}
int  main(){
    int n;
    int count=0;
    while(cin>>n){
        count=0;
        for(int i=2;i<=n;i++){
            if(isprime(i)){
                count++;
            }
        }
        cout<<count<<endl;
    }
    return 0;
}

7-3 多级排序

作者 刘春英 单位 杭州电子科技大学

说到排序,我们都知道这是编程人员必备的知识,更不用说信奥了。

朱逸天,丁爸编程培训班的首期学员,尽管0基础开始,但是进步很大,已经熟练掌握了各种排序的实现。

现在,朱逸天专门准备了这么一个题目,想测试一下同班同学的你,看看你是否也熟练掌握了排序。

假设丁爸信奥培训班共有 \(N(N<100)\) 名同学,已知各位同学的详细信息(姓名,年龄,分数),现在请对培训班的全体同学做一个排序。

排序的规则要求如下:

  • 首先按照分数从高到低进行排序;

  • 如果分数相同,则年龄小的排名靠前;

  • 如果依然不能区分,再按照姓名的字典序排列;

考验你的时候到了,你是否能像朱逸天一样熟练掌握排序呢?

输入格式:

输入包含多组测试用例;

每组数据首先是一个正整数N,表示培训班有N位同学,每位同学的信息占一行,依次是姓名Name、年龄Age和分数Score。

其中,姓名Name是长度不超过10的无空格字符串,年龄Age是不大于\(20\)的正整数,分数Score是不超过\(100\)的浮点数。

输出格式:

请输出排序后的全班同学信息,其中,分数保留\(2\)位小数。

格式参见样例。

输入样例:

6
jaa 18 99.5
bbb 19 100
kcc 19 99
tdd 20 100
abc 18 100
see 19 100

输出样例:

abc 18 100.00
bbb 19 100.00
see 19 100.00
tdd 20 100.00
jaa 18 99.50
kcc 19 99.00

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;
struct stu{
    string name;
    int age;
    double score;
};
bool cmp(stu& a,stu& b){
    if(abs(a.score-b.score)<=1e-6){
        if(a.age==b.age){
            return a.name<b.name;
        }
        return a.age<b.age;
    }
    return a.score>b.score;
}
int main(){
    int n;
    while(cin>>n){
        vector<stu> v(n);
        for(int i=0;i<n;i++){
            cin>>v[i].name>>v[i].age>>v[i].score;
        }
        sort(v.begin(),v.end(),cmp);
        for(int i=0;i<n;i++){
            cout<<v[i].name;
            printf(" %d %.2lf",v[i].age,v[i].score);
            cout<<endl;
        }
    }
    return 0;
}

7-4 超级密码

作者 刘春英 单位 杭州电子科技大学

上次设计的“高级密码”被你们破解了,一丁小朋友很不服气!

现在,他又设计了一套更加复杂的密码,称之为“超级密码”。

说实话,这套所谓的“超级密码”其实也并不难:

对于一个给定的字符串,你只要提取其中的数字,然后连在一起构成一个整数,再乘以刘一丁小朋友的幸运数字513,就是解密后的结果了~

比如,字符串“ads2d4,122”,提取后的整数是24122,然后乘以513,就能得到解密后的结果:12374586。

注:题目保证解密后的结果在32位无符号整数范围。

输入格式:

输入首先包括一个正整数\(N\),表示有N组测试用例。

每组数据占一行,包含一个长度不超过\(30\)的字符串。

输出格式:

请根据题目要求输出解密后的结果,每组数据输出一行。

输入样例:

2
ads2d4,122
0023asdf2AA90

输出样例:

12374586
11947770

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    getchar();
    while(n--){
        unsigned long long res=0;
        char c;
        c=getchar();
        while(c!='\n' && c!=EOF){
            if(c>='0' && c<='9'){
                res*=10;
                res+=c-'0';
            }
            c=getchar();
        }
        res*=513;
        cout<<res<<endl;
    }
    return 0;
}

7-5 别踩白块

作者 刘春英 单位 杭州电子科技大学

有一个铺满了矩形地砖的房间,地砖有黑色和白色两种。你现在站在一块黑色的地砖上面,从这块地砖开始,每次你可以选择向相邻的四块地砖走一步,但是只能走到黑色地砖上面,不能走到白色的地砖上面。

请计算按照上面给出的规则,你能到达的黑色地砖数量是多少。

输入格式:

输入包含多个测试数据。

每个测试用例包含多行,

第一行包含两个整数 \(M, N(1 <= N, M <= 20)\),分别表示房间的长和宽。

接下来有 \(N\) 行,每行包含 \(M\) 个字符,每个字符代表地砖的颜色。

  • '.' 代表黑色的地砖

  • '#' 代表白色的地砖

  • '@' 代表你的起始位置(只会出现一次)

\(M\)\(N\) 都为 \(0\) 时,表示输入结束。

输出格式:

对于每组测试数据,请输出你能到达的黑色地砖数量(包含起始的黑色地砖)。

6 9
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........
11 6
..#..#..#..
..#..#..#..
..#..#..###
..#..#..#@.
..#..#..#..
..#..#..#..
7 7
..#.#..
..#.#..
###.###
...@...
###.###
..#.#..
..#.#..
0 0

输出样例:

45
59
6
13

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<iostream>
#include<vector>
using namespace std;

int n,m,count;
int map[20][20];
int d1[4]={0,0,1,-1};
int d2[4]={1,-1,0,0};
void bfs(int x,int y){
    for(int i=0;i<4;i++){
        if(x+d1[i]<n && x+d1[i]>=0 && y+d2[i]<m && y+d2[i]>=0 && map[x+d1[i]][y+d2[i]]==1){
            count++;
            map[x+d1[i]][y+d2[i]]=0;
            bfs(x+d1[i],y+d2[i]);
        }
    }
}

int main(){
    while(scanf("%d %d",&m,&n)){
        if(m==0 && n==0){
            break;
        }
        char c;
        int x,y;
        count=1;
        getchar();
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                c=getchar();
                if(c=='.'){
                    map[i][j]=1;
                }else if(c=='#'){
                    map[i][j]=0;
                }else if(c=='@'){
                    x=i;
                    y=j;
                    map[i][j]=0;
                }
            }
            getchar();
        }
        bfs(x,y);
        cout<<count<<endl;
    }
    return 0;
}

7-6 机器分配

作者 刘春英 单位 杭州电子科技大学

某总公司拥有设备\(M\)台,准备分给下属的\(N\)个子公司。各子公司若获得这些设备,可以为总公司赚取一定的盈利。

如何分配这\(M\)台设备才能使总公司得到的盈利最大?

请输出最大盈利值。

输入格式:

输入包含多组测试数据。

每组数据第一行为两个整数\(N\)\(M\),表示有\(N\)个子公司,M台设备。

接下来是一个\(N×M\)的矩阵,其中矩阵的第\(i\)行的第\(j\)列的数\(Aij\)表明第\(i\)个子公司分配\(j\)台机器的盈利。

其中:\(N <= 100, M <= 100\)

输出格式:

请计算总公司合理分配这\(M\)台设备所获得的最大盈利。

每组数据输出一行。

输入样例:

2 3
1 2 3
2 3 4

输出样例:

4

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

Code

#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n,m;
    while(cin>>n>>m){
        vector<vector<int>> v(n);
        vector<int> res(m+1);
        for(int i=0;i<n;i++){
            v[i].emplace_back();
            v[i].back()=0;
            for(int j=0;j<m;j++){
                v[i].emplace_back();
                cin>>v[i].back();
            }
        }
        // for(int i=0;i<n;i++){
        //     for(int j=0;j<m;j++){
        //         cout<<" "<<v[i][j];
        //     }
        //     cout<<endl;
        // }
        res=v[0];
        vector<int> temp(m+1);
        for(int i=1;i<n;i++){
            temp[0]=0;
            for(int j=1;j<=m;j++){
                int max=0;
                for(int k=0;k<=j;k++){
                    if(res[k]+v[i][j-k]>max){
                        max=res[k]+v[i][j-k];
                    }
                }
                temp[j]=max;
            }
            res=temp;
        }
        cout<<res.back()<<endl;
    }
    return 0;
}

202401卓裂学院转专业-上机测试
https://acm.nanyan.cc/posts/7e42.html
作者
nanyan
发布于
2024年1月25日
许可协议