• 2020年“感恩杯”台州学院第十三届大学生程序设计竞赛D、H、I题解(后续补充)


    D题:小z与他的袜子

    描述

    小z每天会穿一双新袜子。

    开始他的衣柜里有n双袜子,袜子会从1~n进行编号。每天早上他都会从衣柜里拿编号最小的袜子来穿。每天晚上他会把今天穿的袜子扔进篮子里,如果篮子里有n-1双袜子了,懒惰的小z就得必须把他们洗掉,明天晚上他们会重新放进衣柜里。

    小z想知道在第k天他应该穿哪双袜子。

    输入

    输入为1行,分别是小z的袜子数n和天数k。(2<n<103,1<k<104)

    输出

    输出为1行,为小z第k天穿的袜子编号。

    样例输入

    2 7

    样例输出

    1

    思路:按题意模拟,会发现前n天 穿的袜子编号是1到n,n天之后会以2*(n-1)天循环穿1~(n-1)和1~(n-2)及n编号的袜子。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e6+5;
    
    int a[N];
    int main() {
        int n,k;
        cin>>n>>k;
        if(k<=n) cout<<k<<endl;
        else {
            int e = 0;
            k-=n;
            for(int i = 1;i < n;i++) {
                a[++e] = i;
            }
            for(int i = 1;i < n-1;i++) {
                a[++e] = i;
            }
            a[++e] = n;
            a[0] = a[e];
            cout<<a[k%e]<<endl;
        }
    }
    View Code

    H题:小z的遥控车

    描述

    小z新买了一辆遥控车,这个遥控车的遥控器上的按键按一次可以

      1.前进或后退1m

      2.前进或后退7m

      3.前进或后退10m

    现在他想跑x米,x>0,代表前进x米,x=0,代表原地不动,x<0,代表后退x米。小z想知道他的最小操作数。

    输入

    数据包含多组,第一行为整数T(1≤T≤100),代表测试的组数。

    下面有T组数据,每组1行,为1个整数x,即小z想跑的距离(-100<=x<=100)。

    输出

    每组输出一行,即小z的操作次数。

    样例输入

    3
    8
    0
    -7

    样例输出

    2
    0
    1

    题意:在一维坐标上走x米,求最小操作次数。 题目给出了6种操作方式:(1.前进或后退1m。2.前进或后退7m。 3.前进或后退10m。)

    题意相当于给你x米,用6种操作方式使x变成0。如何得到最小的操作次数呢,先不管。康这里,如果能让6种操作方式同步在x上进行,每同时进行一次,操作次数加1,每次对x操作后得到的值xx在之前的操作中没出现过,就把xx和操作数存起来,直到某一步操作中把x变成了0,那么对应的step就是最小操作次数。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e6+5;
    
    int dx[]={-1,1,-7,7,-10,10};
    map<int,bool>mp;///标记
    int BFS(int x) {
        queue<pair<int,int> >qu;///pair也可以换成结构体
        qu.push({x,0});///初始化操作值 和 操作次数
        mp.clear();///map放全局使用前记得清空
        while(qu.size()){
            x = qu.front().first;
            int step = qu.front().second;
            qu.pop();
            if(x==0) return step;
            step++;
            for(int i = 0;i < 6;i++) {
                int now = x+dx[i];
                if(!mp[now]) {
                    mp[now] = true;
                    qu.push({now,step});
                }
            }
        }
    }
    int main() {
        int T;
        cin>>T;
        int x;
        while(T--) {
            cin>>x;
            cout<<BFS(x)<<endl;
        }
    }
    View Code

    I题:小z的班级平时分

    描述

    小z的美术老师还没有把班上学生认全,于是他从班主任手上拿到了教室座位表。座位表有n行m列,上面写着学生的姓名拼音,小z班上没有学生重名,如果为None(不会全为None),表示当前座位没有坐人。

    开始时所有人的平时分均为0分,迟到一次扣5分,回答一次问题得3分;第x排第y列迟到了,美术老师会记录下“1 x y”,第x排第y列回答了问题,美术老师会记下“2 x y”。 

    慢慢地美术老师已经把班级同学全都认识了,但是她想知道之前分别是谁获得最高分和最低分。

    输入

    输入数据包含多组,以EOF作为结束。

    第一行为整数n和m,代表这个教室为n行m列(1<=n,m<=10)。

    接下来n行每行为m个学生的名字,之间用空格隔开,学生名字不含空格,且不超过20个字符。

    第n+2行为整数q(0<=q<=100),代表美术老师记录的条数。

    接下来q行,每行均为3个整数op,x,y,代表第x行第y列的学生迟到或回答了问题(见描述)。

    输出

    每组输出两行。

    第一行为得分最高的学生姓名及分数,如果分数相同,请输出字典序较小的学生姓名,中间用空格隔开。

    第二行为得分最低的学生姓名及分数,如果分数相同,请输出字典序较小的学生姓名,中间用空格隔开。

    样例输入

    3 3
    ChenggongZheng SanZhang SiLi
    FeihongHuang BaoyuJia DaiyuLin
    None BaochaiXue XifengWang
    5
    1 1 2
    1 3 3
    2 1 1
    2 3 3
    1 1 2

    样例输出

    ChenggongZheng 3
    SanZhang -10

    这里的(1<=n,m<=10) 可以直接用二维数组加结构体模拟位置,模拟完之后要排序,二维数组怎么排序呢,我也不懂,那就把二维转成一维。排序可以用sort,可以在结构体里重载排序函数,也可以自己写一个排序函数放在sort的第三个参数位置。排好序后就是输出了。如果按成绩从高到底,相同成绩按名字字典序从小到大(两个字符串的字典序大小:同时从第一个字符开始比较,以26英文字母顺序后者比前者大排,某个位置比较出了大小就结束比较),那么下标是0的一维数组结构体存的信息就是最高分及同分名字字典序最小的。找最低分且名字字典序最小,就要从排好序的数组里从后往前遍历,如果遍历到下标 [ i ] 数组存的分数信息不等于最后一个下标存的分数信息,就输出下标【i+1】数组的信息即可。

    上面罗里吧嗦了一堆。

    再加上特殊考虑最高分和最低分可能是同一个人即可。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 100+5;
    
    struct node {
        string s;
        int num;
        bool operator<(const node a) {
            if(num!=a.num)
                return num>a.num;
            return s < a.s;
        }
    }b[N],a[N][N];
    int main() {
        int n,m;
        string s;
        while(cin>>n>>m) {
            for(int i = 1;i <= n;i++) {
                for(int j = 1;j <= m;j++) {
                    cin>>s;
                    a[i][j] ={s,0};
                }
            }
            int T;
            cin>>T;
            int e = -1;
            int id,x,y;
            while(T--) {
                cin>>id>>x>>y;
                if(id==1) a[x][y].num-=5;
                else if(id==2) a[x][y].num+=3;
            }
            for(int i = 1;i <= n;i++) {
                for(int j = 1;j <= m;j++) {
                    if(a[i][j].s!="None")
                        b[++e] = a[i][j];
                }
            }
            sort(b,b+e+1);
            cout<<b[0].s<<' '<<b[0].num<<endl;
            for(int i = e;i>=0;i--) {
                if(i==0||b[e].num!=b[i].num) {
                    if(b[e].num!=b[i].num) i++;
                    cout<<b[i].s<<' '<<b[i].num<<endl;
                    break;
                }
            }
    
        }
    }
    View Code
  • 相关阅读:
    8.24Java入门--->第二十六节
    IDEA-->右键没有创建包选项--->新建包不能自动扩展
    8.21Java入门--->第二十五节(多线程)
    个人冲刺(一)——体温上报app(二阶段)
    个人作业——家庭记账本
    个人冲刺(五)——家庭记账本
    个人冲刺(四)——家庭记账本
    个人冲刺(三)——家庭记账本
    个人冲刺(二)——家庭记账本
    个人冲刺(一)——家庭记账本
  • 原文地址:https://www.cnblogs.com/R1ST/p/14164912.html
Copyright © 2020-2023  润新知