目录
A - 百步穿杨
时维九月,序属三秋,辽军大举进攻MCA山,战场上两军正交锋.辽军统帅是名噪一时的耶律-James,而MCA方则是派出了传统武将中草药123.双方经过协商,约定在十一月八日正午十分进行射箭对攻战.中草药123早早就开始准备,但是他是武将而不是铁匠,造弓箭的活就交给聪明能干的你了,现在告诉你每种弓箭规格,即箭身的长度,以及每种规格弓箭所需要的数目,要求你把需要的弓箭都输出.
弓箭的基本样子为 “>±–+>”,其中"±–+"为箭身,数据保证箭身长度 > 2
Input
首先输入一个t,表示有t组数据,跟着t行:
第i行两个整数Ai , Bi,分别代表需要箭身长度为Ai的弓箭Bi枝. (Ai < 30 , Bi < 10 )
Output
按照每组数据需要的箭身的依次输出所有需要的弓箭,每根弓箭占一行.
Sample Input
4
3 4
4 5
5 6
6 7
Sample Output
±+>
±+>
±+>
±+>
±-+>
±-+>
±-+>
±-+>
±-+>
±–+>
±–+>
±–+>
±–+>
±–+>
±–+>
±—+>
±—+>
±—+>
±—+>
±—+>
±—+>
±—+>
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int t;
while(~scanf("%d",&t))
{
int a,b;
while(t--)
{
scanf("%d %d",&a,&b);
for(int i=1;i<=b;i++)
{
printf(">+");
for(int i=1;i<=a-2;i++)
{
printf("-");
}
printf("+>\n");
}
}
}
return 0;
}
B - 三角形
已知一个质地均匀的三角形厚平板以一条边为底,立放在某桌面上,侧面图示如下:
桌面的左边是无限长的,桌面的水平线被视为x轴。
三角形的三个顶点坐标为(x1,0) (x2,0) (x3,h)
桌边的坐标为(d, 0)
请问该三角形是否会掉下桌子(可能三角形放置在桌子外,见样例2)
Input
第1行,整数T表示有T组测试数据。
接下共T组测试数据,对于每组测试数据:
第1行,包括5个整数,x1, x2, x3, h, d, (0 < x1, x2, x3, h, d <= 1000)
Output
对于每组测试数据:
第1行,如果三角形会掉下去,则输出JiaoZhuV5!
否则输出Orz!
Sample Input
2
1 3 2 5 1010 30 20 50 1
Sample Output
Orz!
JiaoZhuV5!
首先先判断x1和d的大小,如果x1>d,那么就直接在掉下去了;如果x1<d,那么判断三角形的重心坐标与d比较。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
double x1,x2,x3,h,d;
cin>>x1>>x2>>x3>>h>>d;
if(x1>=d)//先判断三角形是不是直接被放置在桌子外边
{
printf("JiaoZhuV5!\n");
}
else
{
double num=(x1+x2+x3)/3.0;//求三角形的重心坐标
if(num<=d)
printf("Orz!\n");
else
printf("JiaoZhuV5!\n");
}
}
return 0;
}
C - 壮志难酬
话说MCA山上各路豪杰均出山抗敌,去年曾在江湖威名显赫的,江湖人称<万军中取上将首级舍我其谁>的甘露也不甘示弱,“天将降大任于斯人也,必先劳其筋骨,饿其体肤,空乏其身”他说。可惜,由于去年取上将首级时不慎右手右关节第七次骨折,养伤达一年之久,空有一腔抱负却壮志难酬,如今天下危亡,习武之人又怎能袖手旁观,于是他决定出山协助威士忌共抗辽贼,这时他的对头枫冰叶子出现,两人都是水属性,但由于十年前的一场恩怨(这是后话)势成水火。
枫冰叶子要求甘露回答一个问题,否则不让他离开,可惜甘露绞尽脑汁未果,希望你来帮他解决,助他完成大业。
问题是这样的:给你一个小数x,让你算出小数点后第n位是什么,(1 <= n <= 6)
Input
首先输入一个t,表示有t组数据,跟着t行:
每行输入一个小数(输入数据保证一定是a.b的形式,为了简单化问题,没有循环小数的情况)
然后跟一个n,表示小数点后第几位
Output
输出一个数表示小数点后第n位的数(1 <= n <= 6)
Sample Input
3
1.234 1
2.345 2
3.456 3
Sample Output
2
4
6
首先我是使用字符串类型处理的,但是因为少考虑了temp+num>=str.length(),我们要知道小数后边的零食可以省略的。
后面我又改了使用double类型的处理,本来浮点型的数据是自己会四舍五入的,所以就出现了自己四舍五入的情况。就比如3.456要输出小数点后第三个数,我先是通过求pow(10,3)*3.456再求余10,结果3.456变成了3.4559了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string str;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int num;
cin>>str;
scanf("%d",&num);
int temp;
for(int i=0;i<str.length();i++)
{
if(str[i]=='.')
{
temp=i;
break;
}
}
if(temp+num>=str.length())//这种情况很容易忽略
cout<<'0'<<endl;
else
cout<<str[temp+num]<<endl;
}
return 0;
}
D - 勤能补拙
有道是:“勤能补拙,熟能生巧;细节决定成败,态度决定一切,现象决定本质,现在决定未来;婚姻是游戏的围墙,女人最麻烦了。”
对于“勤能补拙”,也有说是一个人的 总能力值 = 99%的勤奋值 + 1%的天赋
Input
对于每组测试数据:
第一行,输入两个整数,X,Y(0 <= X,Y <= 100)表示一个人的勤奋值与天赋
处理到文件结束
Output
对于每组测试数据:
第一行,输出总能力值,保留二位小数。
Sample Input
100 100
40 50
Sample Output
100.00
40.10
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
double x,y;
while(cin>>x>>y)
{
printf("%.2lf\n",x*0.99+y*0.01);
}
return 0;
}
E - 熟能生巧
有道是:“勤能补拙,熟能生巧;细节决定成败,态度决定一切,现象决定本质,现在决定未来;婚姻是游戏的围墙,女人最麻烦了。”
对于“熟能生巧”,魔方大家都玩过吧?
常见的魔方,每边上有3个小正方体,如下图所示
我们把魔方每边上的小正方体数量叫魔方的“阶”
所以,常见的魔方叫“3阶魔方”。
不过,魔方可不是只有3阶的,
还有2、4、5……阶的呢,如下图所示:
观察所有的魔方,你会发现,
我们可以把魔方表面上的小正方体分为三类:
第一类:有三个面露在外面的;
第二类:有两个面露在外面的;
第三类:有一个面露在外面的。
当然,
这三类小正方体的数量
会随着魔方阶的不同而不同。
你的任务就是计算一下,
对于给定阶数的魔方,
这三类小正方体分别有多少个。
Input
对于每组测试数据:
第一行,一个整数n,表示魔方的阶数,已知 2 <= n <= 1000。
处理到文件结束
Output
对于每组测试数据:
有三行,每行一个整数,分别表示对于该魔方,第一类、第二类、第三类的小正方体的数量。
Sample Input
3
Sample Output
8
12
6
哈哈!作为一个理解能力比较差的孩子,刚开始没有看懂题目的意思。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
printf("8\n");//这个不管是几阶,都是8
int sum=(n-2)*4*2+4*(n-2);//将每个角角去掉
int temp=(n-2)*(n-2)*6;//去掉角角,然后有6个面
printf("%d\n%d\n",sum,temp);
}
return 0;
}
F - 火车上的人数
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。
从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。
现给出的条件是:共有N个车站,始发站上车的人数为a,最后一站下车的人数是m(全部下车)。
试问x站开出时车上的人数是多少?
Input
有多组测试数据。
每组测试数据仅包含一行,每行包括四个整数,a,n,m和x。
0<= a <= 10
3<= n <= 30
1 <= x < n
0 <= m <= 2^31-1
Output
对于每组测试数据,输出一行,包括一个整数,即从x站开出时车上的人数。
Sample Input
5 7 32 4
Sample Output
13
一开始就觉得和求斐不拉契数列好像
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int bus[1005];
int up[1005],down[1005];
int main()
{
int a,n,m,x;
while(~scanf("%d %d %d %d",&a,&n,&m,&x))
{
bus[1]=bus[2]=a;
up[1]=a,down[1]=0;
for(int i=0;;i++)//这里是列举第二个站上车下车人数
{
up[2]=i;
down[2]=i;
for(int j=3;j<n;j++)
{
up[j]=up[j-2]+up[j-1];
down[j]=up[j-1];
bus[j]=bus[j-1]+up[j]-down[j];
}
if(bus[n-1]==m)//这里需要判断一下,因为如果不相等,那就没有解
{
cout<<bus[x]<<endl;
break;
}
}
}
return 0;
}
G - 谁拿了最多奖学金
某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:
-
院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以上论文的学生均可获得;
-
五四奖学金,每人4000元,期末平均成绩高于85分(>85),并且班级评议成绩高于80分(>80)的学生均可获得;
-
成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;
-
西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;
-
班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生*均可获得;
只要符合条件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生*,那么他可以同时获得五四奖学金和班级贡献奖,奖金总数是4850元。
现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖学金的条件)。
Input
有多组测试数据,对于每组测试数据:
第一行是一个整数N(1 <= N <= 100),表示学生的总数。
接下来的N行每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生*,是否是西部省份学生,以及发表的论文数。
姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生*和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。
Output
对于每组测试数据,共输出三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。
如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这N个学生获得的奖学金的总数。
Sample Input
4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1
Sample Output
ChenRuiyi
9000
28700
但凡是涉及到属性中包括字符串的,我一般都会使用结构体或者map,进行排序。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string name[105];
int last;
int grade;
string dept;
string west;
int num;
int main()
{
int n;
map<string,int>str;
while(~scanf("%d",&n))
{
int max_sum=0;
for(int i=1;i<=n;i++)
{
int sum=0;
cin>>name[i]>>last>>grade>>dept>>west>>num;
if(last>80&&num>=1)
sum+=8000;
if(last>85&&grade>80)
sum+=4000;
if(last>90)
sum+=2000;
if(last>85&&west=="Y")
sum+=1000;
if(grade>80&&dept=="Y")
sum+=850;
max_sum+=sum;
str[name[i]]=sum;
}
int max1=-1;
string s;
for(int i=1;i<n;i++)
{
if(str[name[i]]>max1)//不可以等于
{
max1=str[name[i]];
s=name[i];//记录下标
}
}
cout<<s<<endl;
cout<<str[s]<<endl;
cout<<max_sum<<endl;
}
return 0;
}
*H - 过河
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
Input
有多组测试数据,对于每组测试数据:
第一行有一个正整数L(1 <= L <= 10^9),表示独木桥的长度。第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100。第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。
Output
对于每组测试数据,仅输出一行,包括一个整数,表示青蛙过河最少需要踩到的石子数。
Sample Input
10
2 3 5
2 3 5 6 7
Sample Output
2
在这里插入代码片
*I - 乘积最大
今年是国际数学联盟确定的“2000——世界数学年”,又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加。活动中,主持人给所有参加活动的选手出了这样一道题目:
设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大。
同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子:
有一个数字串:312, 当N=3,K=1时会有以下两种分法:
1) 312=36
2) 312=62
这时,符合题目要求的结果是:31*2=62
现在,请你帮助你的好朋友XZ设计一个程序,求得正确的答案。
Input
有多组测试数据。
对于每组测试数据有两行:
第一行共有2个自然数N,K(6≤N≤40,1≤K≤6)
第二行是一个长度为N的数字串。
Output
对于每组测试数据,输出一行,为所求得的最大乘积(一个自然数)。
Sample Input
4 2
1231
Sample Output
62
在这里插入代码片
注:标有*是没有做出来的