HAUT2023周赛(零)

目录

A.I really love haut!

B.工作罢了

C.挑选礼物,但是收礼人 

D.表白

E.约会?干饭!

F.好数

G.lycoris

H.比赛模拟

I.我的矩形

J.堆栈的奇妙世界


A.I really love haut!


*题目描述

HAUT2023周赛(零)_第1张图片

聚聚刚刚步入大学校园,发现自己非常喜欢这种可以随时开卷的生活,于是他想要抒发一下自己的心情。
输出以下所有字符

"I really love haut!\n";

  • 输入

  • 输出

"I really love haut!\n";

*题目解答

注意输出 " 和 \ 需要在前面加 \

#include 
int main()
{
    printf("\"I really love haut!\\n\";");
    return 0;
}

B.工作罢了


*题目描述

HAUT2023周赛(零)_第2张图片

卷卷刚步入大学,借着想要锻炼自己的想法,去竞选了辅导员助理。幸运的是,卷卷竞选成功;不幸的是,刚上任第一天,导员就有工作交给卷卷。现已知学院有n名同学,每个同学都有语文,数学,英语,理综一共4科高考成绩。现在导员让卷卷将这n名同学按照数学成绩从高到低排序,输出排名第一的总成绩,并输出所有人的各科平均成绩。卷卷还不会用Excel,于是她想到用学习的编程知识解决这个问题,请教了据说很厉害的聚聚。聚聚其实不太会,但是已经答应了下来,于是请教了聪明的你。你能帮聚聚解决这个问题吗?

  • 输入

输入共 n+1 行

第一行输入一个整数 n 代表有n名同学

接下来 n 行每行输入 4 个整数分别代表每个人的语文,数学,英语,理综成绩

5
10 20 30 40
20 30 50 60
60 90 110 210
10 30 50 40
51 40 40 50
  • 输出

输出一共两行

第一行输出排名第一的总成绩 (如果有相同的情况,优先输出先输入的)

第二行按顺序输出所有人的语文、数学、英语、理综平均成绩,以空格分隔,保留2位小数

470
30.20 42.00 56.00 80.00
  • 提示

3<=n<=1000
注意题目要求的排名方式 ψ(._. )>

*题目解答

通过打擂台的方式找到数学的最大值,并且分别统计各个科目的成绩。

#include 

int main()
{
    int n;
    scanf("%d", &n);
    double chinese, math, english, science;
    //变量初始化
    double sum_chinese = 0, sum_math = 0, sum_english = 0, sum_science = 0;
    int max_sum = 0, max_math = -1;
    for (int i = 0; i < n; i++)
    {
        scanf("%lf %lf %lf %lf", &chinese, &math, &english, &science);
        if (math > max_math)//update
        {
            max_math = math;
            max_sum = chinese + math + english + science;
        }
        //update
        sum_chinese += chinese;
        sum_math    += math;
        sum_english += english;
        sum_science += science;
    }
    double average_chinese = 0;
    double average_math = 0;
    double average_english = 0;
    double average_science = 0;
    average_chinese=sum_chinese/n;
    average_math=sum_math/n;
    average_english=sum_english/n;
    average_science=sum_science/n;
    printf("%d\n", max_sum);
    printf("%.2f %.2f %.2f %.2f", average_chinese, average_math , average_english , average_science );
    return 0;
}

C.挑选礼物,但是收礼人 


*题目描述

HAUT2023周赛(零)_第3张图片

卷卷非常感谢聚聚帮助她完成了导员交给她的任务,于是卷卷想送给聚聚一个礼物感谢一下聚聚。但卷卷是个选择困难户,她感觉挑礼物非常麻烦,于是邀请聚聚做了一个小游戏。

桌面上有三个纸杯(从左到右编号1-3),三个纸杯里分别装有写有礼物1,2,3的纸条。卷卷决定每次交换两个纸杯,重复n次后让聚聚挑选一个纸杯,把纸杯里的礼物送给聚聚。

卷卷提前告诉了聚聚礼物分别是什么,这里面恰好有聚聚非常想要的东西,聚聚希望最终挑选到他想要的礼物,但聚聚无法判断哪个里面有他想要的东西,于是请你帮忙。

  • 输入

输入一共 n+2 行

第一行输入一个正整数 n(1 <= n <= 20) 代表交换次数,一个正整数 p (p=1,2,3) 代表聚聚想要的礼物

第二行输入三个正整数 a1, a2, a3 代表礼物最初的摆放位置

之后n行每行输入两个正整数 b1, b2 代表交换的纸杯

(要注意的是:最左边的杯子编号永远为 1,最右边的编号永远为 3,不会随着交换而改变)

3 1
1 2 3
2 1
3 1
1 3
  • 输出

一个整数,表示最后聚聚想要的礼物所在的纸杯编号。

2
  • 提示

1 <= n <= 20

*题目解答

记录礼物的初始位置,(序号不会变)然后交换礼物(temp),再遍历查找。

#include 

int main()
{
    int n, present;
    scanf("%d %d", &n, &present);
    int position[4];//初始位置(告诉每个序号上放什么礼物)
    scanf("%d %d %d", &position[1], &position[2], &position[3]);//框框里面代表序号
    for (int i = 0; i < n; i++)
    {
        int number1, number2;//交换礼物的位置(序号的位置不变)
        int temp;
        scanf("%d %d", &number1, &number2);
        temp = position[number1];
        position[number1] = position[number2];
        position[number2] = temp;
    }

    for (int j = 1; j <= 3; j++)//遍历寻找对应的序号
    {
        if (position[j] == present)
        {
            printf("%d", j);
        }
    }
    return 0;
}

D.表白


*题目描述

HAUT2023周赛(零)_第4张图片

聚聚在和卷卷相处过程中喜欢上了卷卷,但是母胎单身的聚聚不知道怎么表白,于是请教了他的“好兄弟”坤坤。坤坤告诉聚聚可以用一种隐晦的方式告诉卷卷。聚聚想到了摩斯密码,聚聚模仿摩斯密码造了一个简单的密码。

聚聚给了卷卷一个字符串,聚聚告诉卷卷加密方法为 各个字符的ascll码加和的值 ,并告诉卷卷表达式的结果就是他想对卷卷说的。

你能帮卷卷解出聚聚想说的是什么吗?

  • 输入

输入一个字符串,仅由大小写字母组成

hgihi
  • 输出

一行,一个整数

521
  • 提示

字符串可以看做结尾字符为'\0'的特殊字符数组,字符串读入操作为scanf("%s",str);

可以利用循环,读到 '\0' 字符作为终止条件

或者也可以选择一个字符一个字符的读入

字符串大小不超过 100000

*题目解答

输入字符串然后直接循环加和。

#include 

int main()
{
    char str[100000];
    gets(str);//等价于scanf("%s",str);
    int sum=0;
    for(int i=0 ; str[i]!='\0'; i++)
    {
        sum = sum + str[i];
    }
    printf("%d",sum);
    return 0;
}

E.约会?干饭!


*题目描述

HAUT2023周赛(零)_第5张图片

聚聚和卷卷在国庆节准备决定出去约会,但是两人在前一天晚上因为出去吃什么无法达成共识,卷卷想吃火锅,但是聚聚想吃牛排,于是他俩决定做一个小游戏,谁赢了就听谁的。

他们找来了 n 堆石子,第 i 堆石子有 ai  个,保证初始时 ai  ≤ ai+1 ( 1 <= i < n )。现在他们轮流对这些石子进行操作,每次操作人可以选择满足  ai > ai-1  ( a0 视为 0 )的一堆石子,并从中取走一个。谁最后不能取了谁输。卷卷先手,他们都使用最优策略,谁赢了就听谁的。

  • 输入

第一行一个整数 n ( 1 <= n <= 100 ),表示石子堆数

接下来一行 n 个数,第 i 个数为 ai ( 1 <= ai <= 1e9 ),意义如上所述

1
1
  • 输出

卷卷赢输出"火锅!"

聚聚赢输出"牛排!"

(输出不带引号)

火锅!
  • 提示

学会 CTRL + C 和 CTRL + V

 *题目解答

因为每人每次只能取一个石子,只需要知道石子总数的奇偶性,因为卷卷先手,所以奇数卷卷赢,偶数聚聚赢。

另外注意输出复制粘贴,一个中文叹号一个英文叹号。

#include 

int main()
{
    int n;//表示石子堆数
    scanf("%d",&n);
    int x[101];//表示某堆石子的个数
    int sum=0;//表示石子的总个数
    for( int i=1; i<=n ;i++)
    {
        scanf("%d",&x[i]);//输入
        sum=sum+x[i];//统计石子个数
        sum=sum%10;//通过个位来看奇偶
    }
    int result;
    result = sum%2;
    if(result==1)
        printf("火锅!");
    else if(result==0)
        printf("牛排!");
    return 0;
}

F.好数


*题目描述

HAUT2023周赛(零)_第6张图片

快期末考试了,摆摆还什么都没学,他很苦恼。某天摆摆在复习时,偶然看见室友坤坤在看占卜节目,上面说射手座今日的幸运数字会是连续递增的。摆摆平时不迷信,但是不自信的他决定今天迷信一次。

摆摆选了一个占卜方法:今天摆摆看到的第一个数字,从最高位到最低位,相邻两位数字是严格递增的总数 除以 (相邻两位数字是严格递增的总数和严格递减的总数)的和,得到的数决定了摆摆通过期末考试的概率。摆摆决定概率 大于 70% 就继续开摆!(大家不能学习摆摆哦~

  • 输入

一个整数 n ,聚聚给摆摆的数

114514
  • 输出

一行

如果摆摆可以继续开摆,输出 "YES ^_^"

否则,输出 "no!!! X_X"

输出均不含引号

YES ^_^
  • 提示

10 <= n <= 1018

样例解释:

递增共有3组,"14","45","14",递减有1组,"51" ,总共4组,递增组占比75%,即概率为75%,大于70%

 *题目解答

判断前后两位递增递减并记录次数,最后递增次数除以递增递减总和即可。

#include 

int main()
{
    char n[19];//表示数字(将每个数字看成字符存放进去)
    gets(n);
    int num_increase=0;
    int num_decrease=0;
    double sum=0;
    for( int i=0 ; n[i+1]!='\0' ; i++)
    {
        if(n[i]n[i+1])//递减组
            num_decrease++;
    }
    sum=num_increase+num_decrease;
    int flag;
    if(num_increase/sum > 0.7)
        flag=1;
    else
        flag=0;
    if(flag==1)
        printf("YES ^_^");
    else if(flag==0)
        printf("no!!! X_X");
    return 0;
}

G.lycoris


*题目描述

HAUT2023周赛(零)_第7张图片

chianago~~~

众所周知,lycoris是坤坤最喜欢的七月番(不接受反驳,虽然烂尾)。坤坤在追番时很生气,因为第一季不是他想要的结局(内心os:我的千束啊啊啊!!!),于是他准备自己写一个结局。

井ノ上たきな 为了找到解救 錦木千束 的方法只身闯入了阿兰机构(???这不是更烂了)。在经历了重重困难后(重点全部跳过是吧)找到了一个新的人工心脏。但是这个心脏需要输入三个数字密码才能运行,输错了就会自我毁灭。

井ノ上たきな 发现装心脏的箱子侧面刻着: 1.[] 2.() 3.{} ,她觉得这是代表密码顺序;箱子内侧有一行仅由三种括号组成的字符串 , 并有 “配对” 的汉字

井ノ上たきな 恰好不认识这两个汉字,于是请教了汉字专家。现在由你来扮演这个汉字专家,并告诉 井ノ上たきな 三个密码分别是多少

  • 输入

一行,一个字符串,仅由如题三种括号组成

[([])]}{
  • 输出

一行,三个整数,以空格分隔,代表三位密码

2 1 0
  • 提示

题目保证每个数字密码都在 0 - 9999 范围内

注意密码序号

注意:括号的配对符合常用语法

o(** ̄▽ ̄**)ブ sakana~~~

 *题目解答

括号配对,即对于相同括号,前括号在前,后括号在后就算匹配成功

(同种括号)记录非匹配括号数量和匹配括号数量,出现前括号非匹配次数++,出现后括号非匹配次数--并且匹配次数++,如果非匹配数量为0,则出现后括号不做变动

#include 

int main()
{
    char str[10000];
    gets(str);
    int x=0, y=0, z=0;
    int x_=0,y_=0, z_=0;
    for( int i=0 ; str[i]!='\0' ;i++)
    {
        //记录一共有多少未配对的括号
        if(str[i]=='{')
            z++;
        else if(str[i]=='[')
            x++;
        else if(str[i]=='(')
            y++;
        //统计匹配的括号
        else if(str[i]==')')
        {
            if(y != 0)
            {
                y--;//出现后括号非匹配次数--
                y_++;//匹配次数++
            }
        }
        else if (str[i] == ']')
        {
            if (x != 0)
            {
                x--;
                x_++;
            }
        }
        else if (str[i] == '}')
        {
            if (z != 0)
            {
                z--;
                z_++;
            }
        }
    }
    printf("%d %d %d",x_,y_,z_);
    return 0;
}

H.比赛模拟


*题目描述

HAUT2023周赛(零)_第8张图片

你的好朋友参加了很多场acm赛制(本场周赛的名次就是按照acm赛制排名,oi名次是考虑进题目的测试点得分)的比赛。

acm赛制:每道题提交之后都有反馈,可以看到“正确”、“答案错误”、“运行超时”等结果,但看不到错误的测试点。每道题不限制提交次数,但没通过的话会有罚时(只计算最终通过题目的罚时),每一次非正确提交罚时20分钟。比赛过程中一般可以看到实时排名,按照通过题数从大到小排名,通过题数相同的情况下按照答题时间(所有通过题目的第一次通过时间)+罚时(所有通过题目的罚时)来排名。

由于你的好朋友很强,所以每道题都可以过。他现在想知道每场比赛的总用时 = 答题时间(所有通过题目的第一次通过时间)+罚时(所有通过题目的罚时),现在有他很多场比赛记录但是丢失了用时,现在来求助你。

  • 输入

多组数据,文件尾结束

对于每组数据,第一行一个整数 n (1 <= n <= 20) 代表这场的题目个数
接下来 n 行,每行有两个整数,之间以空格分割,第 i 行有 t_i (0 <= t_i <= 300)和 cnt_i (0 <= cnt_i <= 100) ,分别代表第 i 道题的第一次通过的时间和 第 i 道题在第一次通过前非正确提交的次数。

2
28 2
8 1
3
28 0
22 0
6 0
4
11 0
26 0
28 2
9 0
4
14 1
29 1
13 2
22 1
  • 输出

对于每组数据需你输出一个整数,代表这场比赛的总用时。
不同组数据之间用回车"\n"来进行分割。

96
56
114
178
  • 提示

这是一个多组测试样例的题目。意思为每一个测试文件中会放入多组测试数据(未知多少组),当你读取数据读到文件结尾时代表结束。

示例:c 语言 
    // 这里scanf当读取到文件尾就会返回 -1 ,
    // EOF为一个宏,EOF(end of file),文件结尾,EOF定义在stdio.h 文件中 #define EOF (-1)
    // 当你写的程序在本地测试不是文件作为读取流,是在终端运行,可以按 windows下为ctrl+z,linux/unix下为ctrl+c或ctrl+d;
    // 就是可以在终端中先复制测试样例,然后回车 按 'ctrl + z' 或者 'ctrl + d'
    while(scanf("%d",&n) != EOF){
    
    }

    c ++ 语言

    // 这里 cin 可以作为判断条件是发生了隐式转化,具体了解可以参考  https://en.cppreference.com/w/cpp/io/basic_istream
    while(std::cin >> n){

    }

 *题目解答

题目中已经告诉每一次非正确提交罚时20分钟并且每场比赛的总用时 = 答题时间(所有通过题目的第一次通过时间)+罚时(所有通过题目的罚时)。

#include 

int main()
{
    int n ;
    while(scanf("%d",&n) != EOF)// 多组数据,读取到数据尾结束
    {
        int time = 0 ;
        for(int i = 1; i <= n ; i ++)// n 道题目
        {
            int x,y ;
            scanf("%d %d",&x,&y) ;
            time += x + y * 20 ;    // 进行计算本题目的用时
        }
        printf("%d\n",time) ;   // 输出答案
    }
    return 0 ;
}

I.我的矩形


*题目描述

HAUT2023周赛(零)_第9张图片

给你n个正整数a[i] (i=1.....n),你需要将这n个正整重新排列形成一个x行y列的数字矩阵。

排列规则:按照输入顺序从左到右自上而下进行排列。

请给出你排列的矩阵。(输入保证n=x*y)

  • 输入

第一行三个正整数依次为n、x、y。

第二行n个正整数

(n<=1e6,x*y<=n,a[i]<1e5)

6 2 3
1 2 3 4 5 99999
  • 输出

x行y列的整数矩阵,矩阵中的每个数字都需要占五位,即可能需要前导0。

00001 00002 00003 
00004 00005 99999

 *题目解答

在读取数字的时候同时输出,输出数量为y的倍数时输出回车即可。

#include

int main()
{
	int n,x,y;
    scanf("%d %d %d",&n,&x,&y);
    for(int i=1;i<=n;i++)
    {
        int number;
        scanf("%d",&number);
        printf("%05d ",number);
        if(i%y==0)
            printf("\n");
    }
	return 0;
}

J.堆栈的奇妙世界


*题目描述

HAUT2023周赛(零)_第10张图片

一天,jxh聚聚在他的实验室里,对着一堆零散的零件发呆。他一直在思考一个问题:如何让计算机更加高效地进行操作?在无数次的尝试和失败后,他突然灵光一闪,想到了一个前所未有的想法——使用堆栈进行操作。

堆栈,一个看似平常的数据结构,却蕴含着无穷的可能性。jxh聚聚开始研究如何将堆栈的原理应用到计算机中。他设计了一种新型的计算机架构,将堆栈的特性融入到计算机的操作中,使得计算机在进行各种操作时,都能像堆栈一样高效、有序。

经过几个月的努力,jxh聚聚终于成功地制造出了第一台使用堆栈进行操作的计算机。这台计算机的性能远超过现有的任何一台计算机,无论是处理数据的速度,还是运行程序的效率,都达到了前所未有的高度。但是他需要你来进行程序的编写。计算机拥有一个无限大的内存,有一个初始时为空的数列,已知计算机可以进行如下操作:

1 在数列末尾放入一个数字1

2 将数列末尾的数字复制一份放到末尾

3 将数列末尾两个数字取出并从中删除,相加,然后放回数列尾部

现在给出所有的操作,请你输出最终的数列(从头至尾),每个数字用空格隔开。

(数据保证不会超出int范围,并且保证每次操作都有效)

  • 输入

第一行一个整数n, 1 <= n <= 10000。

然后接下来n行每行一个操作x, 1 <= x <= 3。

5
1
1
3
2
2
  • 输出

一行整数,用空格隔开

2 2 2 

*题目解答

按照题目描述进行操作即可, 注意记录数列的长度变化。

#include 

int main()
{
    int n;
    scanf("%d", &n);
    int a[10005], index=0;
    for (int i = 0; i < n; i++) 
    {
        int op;
        scanf("%d", &op);
        if (op == 1) 
        {
            a[index] = 1;
            index++;
        } 
        else if (op == 2) 
        {
            a[index] = a[index - 1];
            index++;
        } 
        else 
        {
            a[index - 2] += a[index - 1];
            index--;
        }
    }
    for (int j = 0; j < index; j++) 
        printf("%d ", a[j]);
    return 0;
}

你可能感兴趣的:(HAUTOJ2023周赛,算法,c++,c语言)