您的位置:首页 > 其它

北京航空航天大学2014第四次上机解题报告

2014-11-16 16:12 260 查看


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;

}

}

}

}

这道题主要给我们的启示是:对于一个问题,既不能不作思考,又不能因为思考量过大而陷入自己制造的思维漩涡,导致失败。

第二题:正义的天平

ProblemDescription

KamuiKirito简洁明了。

给你一串字符,如果是字母则输出对应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;

}

}

第三题:恶魔的证明

ProblemDescription

KamuiKirito简洁明了。

给你一串字符,如果存在一个大写字母相邻的两个字母都是小写字母,则证明这串字符有恶魔存在。

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;

}

两种方法各有利弊,可能还有更多的方法,请大家也积极思考~




第四题:约伯的救赎

ProblemDescription

KamuiKirito的家乡下雪了。

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;

}

}

}

第六题:掷石之人

ProblemDescription

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也是一样的~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: