目录
A.I really love haut!
B.工作罢了
C.挑选礼物,但是收礼人
D.表白
E.约会?干饭!
F.好数
G.lycoris
H.比赛模拟
I.我的矩形
J.堆栈的奇妙世界
*题目描述
聚聚刚刚步入大学校园,发现自己非常喜欢这种可以随时开卷的生活,于是他想要抒发一下自己的心情。
输出以下所有字符
"I really love haut!\n";
输入
无
无
输出
"I really love haut!\n";
无
*题目解答
注意输出 " 和 \ 需要在前面加 \
#include
int main()
{
printf("\"I really love haut!\\n\";");
return 0;
}
*题目描述
卷卷刚步入大学,借着想要锻炼自己的想法,去竞选了辅导员助理。幸运的是,卷卷竞选成功;不幸的是,刚上任第一天,导员就有工作交给卷卷。现已知学院有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;
}
*题目描述
卷卷非常感谢聚聚帮助她完成了导员交给她的任务,于是卷卷想送给聚聚一个礼物感谢一下聚聚。但卷卷是个选择困难户,她感觉挑礼物非常麻烦,于是邀请聚聚做了一个小游戏。
桌面上有三个纸杯(从左到右编号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;
}
*题目描述
聚聚在和卷卷相处过程中喜欢上了卷卷,但是母胎单身的聚聚不知道怎么表白,于是请教了他的“好兄弟”坤坤。坤坤告诉聚聚可以用一种隐晦的方式告诉卷卷。聚聚想到了摩斯密码,聚聚模仿摩斯密码造了一个简单的密码。
聚聚给了卷卷一个字符串,聚聚告诉卷卷加密方法为 各个字符的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;
}
*题目描述
聚聚和卷卷在国庆节准备决定出去约会,但是两人在前一天晚上因为出去吃什么无法达成共识,卷卷想吃火锅,但是聚聚想吃牛排,于是他俩决定做一个小游戏,谁赢了就听谁的。
他们找来了 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;
}
*题目描述
快期末考试了,摆摆还什么都没学,他很苦恼。某天摆摆在复习时,偶然看见室友坤坤在看占卜节目,上面说射手座今日的幸运数字会是连续递增的。摆摆平时不迷信,但是不自信的他决定今天迷信一次。
摆摆选了一个占卜方法:今天摆摆看到的第一个数字,从最高位到最低位,相邻两位数字是严格递增的总数 除以 (相邻两位数字是严格递增的总数和严格递减的总数)的和,得到的数决定了摆摆通过期末考试的概率。摆摆决定概率 大于 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;
}
*题目描述
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;
}
*题目描述
你的好朋友参加了很多场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 ;
}
*题目描述
给你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;
}
*题目描述
一天,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;
}