北京航空航天大学2014第四次上机解题报告
2014-11-16 16:12
260 查看
目录
2014第四次上机解题报告...
1
第一题:邻近的虚实...
2
Input.
2
Output.
2
SampleInput.
2
SampleOutput.
2
Hint.
2
第二题:正义的天平...
4
ProblemDescription..
4
Input.
4
Output.
4
SampleInput.
4
SampleOutput.
4
第三题:恶魔的证明...
5
ProblemDescription..
5
Input.
6
Output.
6
SampleInput.
6
SampleOutput.
6
第四题:约伯的救赎...
9
ProblemDescription..
9
Input.
9
Output.
9
SampleInput.
9
SampleOutput.
9
第五题:无法禁止的游戏...
11
Input.
11
Output.
12
SampleInput.
12
SampleOutput.
12
第六题:掷石之人...
13
ProblemDescription..
13
Input.
14
Output.
14
SampleInput.
14
SampleOutput.
14
Hint.
14
KamuiKirito简洁明了。
给你一个时间,判断这个时间是否合法。
没有闰秒一类奇怪的东西
不存在24:00:00,只有0:00:00
注意前导0
Input
多组测试数据。
每组数据为一行字符串,格式见样例。
Output
每组数据输出一行,合法输出Yes,不合法输出No。
SampleInput
23:33:33
5:05:05
6:66:66
SampleOutput
Yes
Yes
No
Hint
推荐用C语言格式的输入。
当然不用也是可以AC的。
这道题难度并不很大,但是会因为以下几点造成错误:
粗心大意,将小时数,分钟数,秒钟数的上限都分别当成了24,60,60,所以导致出错。
思考的事情太多,不仅考虑到数值的合法,还考虑到了诸如“11:00001:000001”这类情况的不合法,导致严重浪费时间,同时不易做对。
那么,正确的做法就很简单了,下面是代码样例:
#include<iostream>
#include<cstdio>
usingnamespacestd;
intmain()
{
inta,b,c;
while(~scanf("%d:%d:%d",&a,&b,&c))
{
if(a>=24)
cout<<"No"<<endl;
else
{
if(b>=60)
cout<<"No"<<endl;
else
{
if(c>=60)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
}
}
}
这道题主要给我们的启示是:对于一个问题,既不能不作思考,又不能因为思考量过大而陷入自己制造的思维漩涡,导致失败。
KamuiKirito简洁明了。
给你一串字符,如果是字母则输出对应ASCII码,如果是数字则直接输出该数字
Input
多组测试数据。
每组数据有两行。
第一行为n,为字符串长度。
第二行为一串字符,长度为n,为英文字母或数字。
Output
每组数据输出一行,为题目要求输出。
SampleInput
3
450
8
jhljx233
SampleOutput
450
106104108106120233
第二题,这道题主要考察了字符表现方式和ascll码的知识,同时,这道题使用string也可以做。
解决这道题的思路:
判断每一个字符是否为“0123456789”
如果是,输出本数。
如果不是,输出对应的ascll码,注意要将其减去‘0’
易错点的话。。。就是对不熟悉char或者string的同学的话,全部都是易错点。。。
#include<cstdio>
#include<string>
usingnamespacestd;
intmain()
{
intn,m;
stringa;
while(cin>>n)
{
cin>>a;
for(inti=1;i<=n;i++)
{
m=a[i-1]-'0';
if(m>=0&&m<=9)
{
cout<<m;
}
else
{
cout<<m+48;
}
}
cout<<endl;
}
}
KamuiKirito简洁明了。
给你一串字符,如果存在一个大写字母相邻的两个字母都是小写字母,则证明这串字符有恶魔存在。
Input
多组测试数据。
每组数据有两行。
第一行为n,为字符串长度。
第二行为一串字符,长度为n。
Output
每组数据输出一行,如果存在恶魔输出Yes,否则输出No。
SampleInput
5
jhljx
11
KamuiKirito
SampleOutput
No
Yes
这道题有两种做法:
一次性判断连续的三个字符,每次向后移动一个字符长度
每次都对某单个字符的前后赋以新的字符,这样在循环中判断
这两种做法都有可取之处,不过个人偏向第一种(毕竟可能好想一点,但是要使用到字符串的知识),第二种(思考量大,所用知识少)
下面把两种代码都贴在下面:
第一种(使用字符串):
KamuiKirito的家乡下雪了。
KamuiKirito发现n片雪花聚集在一起的形状跟n有关。
n=1:
#
n=2:
##
n=3:
##
*
n=4:
##
**
n=5:
##
**
#
Input
多组测试数据。每组测试数据只有一行为一个整数n(1<=n<=30)。
Output
对于每组输入数据,输出雪花的样子。
SampleInput
8
SampleOutput
##
**
##
**
KamuiKirito和jhljx玩游戏。
一个由n条横线m条竖线构成的网格。
例如一个3*3的网格
每次一方选择一个交点,将该点所在的横线和竖线删掉然后又另一方进行。
进行时如果网格不存在交点则失败。
jhljx大神先来。
Input
多组测试数据
每组测试数据一行,两个整数,为n,m。(1<=n,m<=100)
Output
对于每组输入数据,输出一行,为获胜方。
SampleInput
11
22
SampleOutput
jhljx
KamuiKirito
可以说这道题开始才对数字有关的算法有所考察,那么,看起来如此难以直接得出答案的一道题,是否有什么简单易行的方法呢?
从历史的经验看,这类题一般都有规律的。
我们先从横竖都只有一条线开始做起:1,1,
那么,肯定是先拿的人赢了
好,那么2,2呢?3,3呢?
通过这三次探索,我们发现一旦出现x,x的情况,则每次拿完一个点后都会相当于x-1,x-1问题,则可以直接判断奇偶,来看是谁赢了。
讨论完相同的情况,再看看不同的。
2,3呢?3,2呢?4,3呢?
2,3的次数与2,2是相同的,4,3则与3,3相同!
哦哦!那么明白了,这道题判断的是输入的两个数哪个小,然后再判断其奇偶性就可以啦!
所以,代码如下:
#include<iostream>
#include<cstdio>
usingnamespacestd;
intmain()
{
inta,b,k;
while(cin>>a>>b)
{
if(a>=b)
{
k=b;
}
else
{
k=a;
}
if(k%2==0)
{
cout<<"KamuiKirito"<<endl;
}
else
{
cout<<"jhljx"<<endl;
}
}
}
Creeper学妹每天都从五楼使用小型火焰烧楼下约会的XXX。
jhljx有些忍不了了,于是Creeper学妹做出妥协。
从今天(2014年11月14日)开始,每周五才使用奥义:火球术。剩下的日子由掷石子代替。
给你一个日期,让你判断这天Creeper学妹是喷火还是掷石子。
Input
多组测试数据
每组测试数据一行,为一个日期(保证合法)。
Output
对于每组输入数据,输出一行,如果Creeper学妹喷火则输出Fire,否则输出Poor
Creeper。
SampleInput
2014-11-14
2015-01-02
2015-01-03
SampleOutput
Fire
Fire
PoorCreeper
Hint
无限大な梦のあとの
何もない世の中じゃ
这道题如果直接用日子算的话。。。会浪费很多时间在是否闰年啦,是否大月小月啦(31天或30天)还有坑爹的2月的这些讨论中。
所以我们要按照宋老师上课说过的那样,某公式就可以一下解决这个问题。
我们这里介绍两个公式
第一:蔡勒公式
以下来自于网络
第二:基姆拉尔森公式
这两个公式大同小异,只要用好即可。
注意:
不要打错条件,注意两个公式都有其特殊值,如果不将公式完全使用可能导致出错。
代码如下:
#include<stdio.h>
usingnamespacestd;
intmain()
{
inty,m,d;
while(scanf("%d-%d-%d",&y,&m,&d)!=EOF)
{
if(m==1||m==2)
{
y--;
m+=12;
}
printf((((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7==5)?"Fire\n":"PoorCreeper\n"));
}
return0;
}
**注意,这个代码用了”c1?c2:c3”这个小小的三元运算式哦,不过换成if…else也是一样的~
2014第四次上机解题报告
——by
于济凡
目录2014第四次上机解题报告...
1
第一题:邻近的虚实...
2
Input.
2
Output.
2
SampleInput.
2
SampleOutput.
2
Hint.
2
第二题:正义的天平...
4
ProblemDescription..
4
Input.
4
Output.
4
SampleInput.
4
SampleOutput.
4
第三题:恶魔的证明...
5
ProblemDescription..
5
Input.
6
Output.
6
SampleInput.
6
SampleOutput.
6
第四题:约伯的救赎...
9
ProblemDescription..
9
Input.
9
Output.
9
SampleInput.
9
SampleOutput.
9
第五题:无法禁止的游戏...
11
Input.
11
Output.
12
SampleInput.
12
SampleOutput.
12
第六题:掷石之人...
13
ProblemDescription..
13
Input.
14
Output.
14
SampleInput.
14
SampleOutput.
14
Hint.
14
第一题:邻近的虚实
题目描述:KamuiKirito简洁明了。
给你一个时间,判断这个时间是否合法。
没有闰秒一类奇怪的东西
不存在24:00:00,只有0:00:00
注意前导0
Input
多组测试数据。
每组数据为一行字符串,格式见样例。
Output
每组数据输出一行,合法输出Yes,不合法输出No。
SampleInput
23:33:33
5:05:05
6:66:66
SampleOutput
Yes
Yes
No
Hint
推荐用C语言格式的输入。
当然不用也是可以AC的。
这道题难度并不很大,但是会因为以下几点造成错误:
粗心大意,将小时数,分钟数,秒钟数的上限都分别当成了24,60,60,所以导致出错。
思考的事情太多,不仅考虑到数值的合法,还考虑到了诸如“11:00001:000001”这类情况的不合法,导致严重浪费时间,同时不易做对。
那么,正确的做法就很简单了,下面是代码样例:
#include<iostream>
#include<cstdio>
usingnamespacestd;
intmain()
{
inta,b,c;
while(~scanf("%d:%d:%d",&a,&b,&c))
{
if(a>=24)
cout<<"No"<<endl;
else
{
if(b>=60)
cout<<"No"<<endl;
else
{
if(c>=60)
cout<<"No"<<endl;
else
cout<<"Yes"<<endl;
}
}
}
}
这道题主要给我们的启示是:对于一个问题,既不能不作思考,又不能因为思考量过大而陷入自己制造的思维漩涡,导致失败。
第二题:正义的天平
ProblemDescriptionKamuiKirito简洁明了。
给你一串字符,如果是字母则输出对应ASCII码,如果是数字则直接输出该数字
Input
多组测试数据。
每组数据有两行。
第一行为n,为字符串长度。
第二行为一串字符,长度为n,为英文字母或数字。
Output
每组数据输出一行,为题目要求输出。
SampleInput
3
450
8
jhljx233
SampleOutput
450
106104108106120233
第二题,这道题主要考察了字符表现方式和ascll码的知识,同时,这道题使用string也可以做。
解决这道题的思路:
判断每一个字符是否为“0123456789”
如果是,输出本数。
如果不是,输出对应的ascll码,注意要将其减去‘0’
易错点的话。。。就是对不熟悉char或者string的同学的话,全部都是易错点。。。
代码如下:
#include<iostream>
#include<cstdio>
#include<string>
usingnamespacestd;
intmain()
{
intn,m;
stringa;
while(cin>>n)
{
cin>>a;
for(inti=1;i<=n;i++)
{
m=a[i-1]-'0';
if(m>=0&&m<=9)
{
cout<<m;
}
else
{
cout<<m+48;
}
}
cout<<endl;
}
}
第三题:恶魔的证明
ProblemDescriptionKamuiKirito简洁明了。
给你一串字符,如果存在一个大写字母相邻的两个字母都是小写字母,则证明这串字符有恶魔存在。
Input
多组测试数据。
每组数据有两行。
第一行为n,为字符串长度。
第二行为一串字符,长度为n。
Output
每组数据输出一行,如果存在恶魔输出Yes,否则输出No。
SampleInput
5
jhljx
11
KamuiKirito
SampleOutput
No
Yes
这道题有两种做法:
一次性判断连续的三个字符,每次向后移动一个字符长度
每次都对某单个字符的前后赋以新的字符,这样在循环中判断
这两种做法都有可取之处,不过个人偏向第一种(毕竟可能好想一点,但是要使用到字符串的知识),第二种(思考量大,所用知识少)
下面把两种代码都贴在下面:
第一种(使用字符串):
#include<iostream>
#include<cstdio>
usingnamespacestd;
intmain()
{
intn,counter;
stringa;
while(cin>>n)
{
counter=0;
cin>>a;
for(inti=1;i<=n-2;i++)
{
if(a[i-1]<='z'&&a[i-1]>='a'&&a[i]<='Z'&&a[i]>='A'&&a[i+1]<='z'&&a[i+1]>='a')
{
counter++;
}
}
if(counter!=0)
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
}
第二种(不使用字符串)
#include<stdio.h>
usingnamespacestd;
intmain()
{
intn;
boolflag;
charx,y;
while(scanf("%d",&n)!=EOF)
{
getchar();
flag=false;
y=0;
for(;n>0;n--)
{
x=getchar();
if(flag==false)
{
if(x<='Z'&&x>='A')
{
if(y<='z'&&y>='a')
flag=true;
}
}
else
{
if(x<='z'&&x>='a')
{
for(;n>1;n--)
getchar();
printf("Yes\n");
break;
}
else
flag=false;
}
y=x;
}
if(n==0)
printf("No\n");
}
return0;
}
两种方法各有利弊,可能还有更多的方法,请大家也积极思考~
第四题:约伯的救赎
ProblemDescriptionKamuiKirito的家乡下雪了。
KamuiKirito发现n片雪花聚集在一起的形状跟n有关。
n=1:
#
n=2:
##
n=3:
##
*
n=4:
##
**
n=5:
##
**
#
Input
多组测试数据。每组测试数据只有一行为一个整数n(1<=n<=30)。
Output
对于每组输入数据,输出雪花的样子。
SampleInput
8
SampleOutput
##
**
##
**
这道题是一个画图形问题,只要对于奇偶行数有所判断,然后对于最后一行要有所讨论,考虑到了这两个问题之后,这道题就差不多完成了。
*奇偶行的不同是最关键!
下面是代码:
#include<iostream>
#include<cstdio>
usingnamespacestd;
intmain()
{
intn,line,number,i;
while(cin>>n)
{
line=n/2;
for(i=1;i<=line;i++)
{
if(i%2==1)
{
for(intj=1;j<=2;j++)
{
cout<<"#";
}
cout<<endl;
}
else
{
for(intj=1;j<=2;j++)
{
cout<<"*";
}
cout<<endl;
}
}
number=n-2*line;
for(intk=1;k<=number;k++)
{
if(line%2==1)
{
cout<<"*";
cout<<endl;
}
else
{
cout<<"#";
cout<<endl;
}
}
}
}
第五题:无法禁止的游戏
ProblemDescription
KamuiKirito和jhljx玩游戏。
一个由n条横线m条竖线构成的网格。
例如一个3*3的网格
每次一方选择一个交点,将该点所在的横线和竖线删掉然后又另一方进行。
进行时如果网格不存在交点则失败。
jhljx大神先来。
Input
多组测试数据
每组测试数据一行,两个整数,为n,m。(1<=n,m<=100)
Output
对于每组输入数据,输出一行,为获胜方。
SampleInput
11
22
SampleOutput
jhljx
KamuiKirito
可以说这道题开始才对数字有关的算法有所考察,那么,看起来如此难以直接得出答案的一道题,是否有什么简单易行的方法呢?
从历史的经验看,这类题一般都有规律的。
我们先从横竖都只有一条线开始做起:1,1,
那么,肯定是先拿的人赢了
好,那么2,2呢?3,3呢?
通过这三次探索,我们发现一旦出现x,x的情况,则每次拿完一个点后都会相当于x-1,x-1问题,则可以直接判断奇偶,来看是谁赢了。
讨论完相同的情况,再看看不同的。
2,3呢?3,2呢?4,3呢?
2,3的次数与2,2是相同的,4,3则与3,3相同!
哦哦!那么明白了,这道题判断的是输入的两个数哪个小,然后再判断其奇偶性就可以啦!
所以,代码如下:
#include<iostream>
#include<cstdio>
usingnamespacestd;
intmain()
{
inta,b,k;
while(cin>>a>>b)
{
if(a>=b)
{
k=b;
}
else
{
k=a;
}
if(k%2==0)
{
cout<<"KamuiKirito"<<endl;
}
else
{
cout<<"jhljx"<<endl;
}
}
}
第六题:掷石之人
ProblemDescriptionCreeper学妹每天都从五楼使用小型火焰烧楼下约会的XXX。
jhljx有些忍不了了,于是Creeper学妹做出妥协。
从今天(2014年11月14日)开始,每周五才使用奥义:火球术。剩下的日子由掷石子代替。
给你一个日期,让你判断这天Creeper学妹是喷火还是掷石子。
Input
多组测试数据
每组测试数据一行,为一个日期(保证合法)。
Output
对于每组输入数据,输出一行,如果Creeper学妹喷火则输出Fire,否则输出Poor
Creeper。
SampleInput
2014-11-14
2015-01-02
2015-01-03
SampleOutput
Fire
Fire
PoorCreeper
Hint
无限大な梦のあとの
何もない世の中じゃ
这道题如果直接用日子算的话。。。会浪费很多时间在是否闰年啦,是否大月小月啦(31天或30天)还有坑爹的2月的这些讨论中。
所以我们要按照宋老师上课说过的那样,某公式就可以一下解决这个问题。
我们这里介绍两个公式
第一:蔡勒公式
以下来自于网络
第二:基姆拉尔森公式
这两个公式大同小异,只要用好即可。
注意:
不要打错条件,注意两个公式都有其特殊值,如果不将公式完全使用可能导致出错。
代码如下:
#include<stdio.h>
usingnamespacestd;
intmain()
{
inty,m,d;
while(scanf("%d-%d-%d",&y,&m,&d)!=EOF)
{
if(m==1||m==2)
{
y--;
m+=12;
}
printf((((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7==5)?"Fire\n":"PoorCreeper\n"));
}
return0;
}
**注意,这个代码用了”c1?c2:c3”这个小小的三元运算式哦,不过换成if…else也是一样的~
相关文章推荐
- 北京航空航天大学2014第三次上机解题报告
- 北京航空航天大学2014第六次上机解题报告
- 北京航空航天大学2014第五次上机解题报告
- 北京航空航天大学2014第二次上机解题报告
- 北京航空航天大学 2009年复试上机题 解题报告
- 北京航空航天大学 2012年复试上机题 解题报告
- 北京航空航天大学 2008年复试上机题 解题报告
- C++第四次上机实验报告
- NOIP2014解方程解题报告
- codeforces Coder-Strike 2014 Round 1 C题解题报告
- 谷歌中国算法比赛解题报告 APAC2014A
- 2014 牡丹江现场赛 A.Average Score(zoj 3819) 解题报告
- 2014百度之星资格赛解题报告:Xor Sum
- 【作业解答】第三次上机作业解题报告
- 【百度之星2014~初赛(第二轮)解题报告】JZP Set
- 2014 UESTC暑前集训动态规划专题解题报告
- ZOJ Monthly, June 2014 解题报告
- LuoguP2312[NOIP2014] 解方程 解题报告【秦九韶算法】
- 【NOIP2014提高组】【Day1】【解题报告】
- 2014NOIP复赛模拟练习 设置喷水池 解题报告