"创元杯"2018安徽科技学院第九届ACM程序设计竞赛~~解题报告

“创元杯”2018安徽科技学院第九届ACM程序设计竞赛网址:http://oj.ahstu.cc/JudgeOnline/contest.php?cid=1156
(本文末尾附有本次竞赛的现场图与成绩表。)

A题: 星期几

Description

水题水题, 没有最水,只有更水。
已知今天是星期a(a=1~77代表星期天),再过b天是星期几?

Input

连续输入两个整数 a、 b,当a=0且b=0时结束输入

Output

输出从星期a开始再过b天是星期几?,并换行。

Sample Input

1 2
0 0

Sample Output

3

本题思路:A+B的变形。但是需要注意的是,结果要对7取模,取模后的结果如果是0,要输出7

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


B题: 区间四叶花数

Description

判断区间【a,b】中四叶花数的个数.
所谓“四叶花数”是指一个四位数,其各位数字四次方和等于该数本身。
例如:1634是一个“四叶花数”,因为1634= 1^4+ 6^4 + 3^4 + 4^4

Input

连续多组输入两个整数 a、 b,(0<=a<=b<=1000000007)输入直到文件尾结束。

Output

输出区间【a,b】中四叶花数的个数,并换行。

Sample Input

1234 1767
0 0

Sample Output

1

本题的考点是需要优化区间。四叶花数是对四位数进行操作的,所以只需要判断区间【1000,9999】即可。此外,由于易知四叶花数只有三个数,即1634, 8208, 9474,所以只需要判断这三个数是不是在输入的区间内即可,不需要用for循环来一个一个判断,否则会超时(TLE),这样判断时间复杂度是O(1)

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


C题: 全同判断

Description

输入一个字符判断是不是完全是同一个字母组成,是的话输出Y 否则输出N

Input

第一个是N
随后是N个字符串,判断是否完全相同

Output

相同是的话输出Y 否则输出N

Sample Input

2
11
223

Sample Output

Y
N

这道题是本此比赛最简单的一道题了,人人都会做,没什么可讲的了。。。

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


D题:超级楼梯

Description

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或三级,
要走上第M级,共有多少种走法?

Input

输入数据首先包含一个整数N,表示测试实例的个数,
然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

Output

对于每个测试实例,请输出不同走法的数量

Sample Input

2
2
3

Sample Output

1
2

经典的动态规划入门题,是个fibonacci数列的变形。转移方程是:dp[i] = dp[i-1] + dp[i-3]

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


E题:字符串对比

Description

给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下5中情况之一: 
  1:两个字符串长度不等。比如  Beijing  和  Hebei 
  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如  Beijing  和  Beijing 
  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如  beijing  和  BEIjing 
  4:两个字符串长度相等,但是在不考虑大小写的情况下对称 如 Acm  MCa,
   5: 两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如  Beijing  和  Nanjing 
  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。 

Input

包括两行,每行都是一个字符串 

Output

仅有一个数字,表明这两个字符串的关系编号 

Sample Input

BEIjing
beiJing

Sample Output

3

枚举一下字符串属于哪一种类型,挺简单的一道题。

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


F题:身份证排序

Description

安全局搜索到了一批(n个)身份证号码,希望按出生日期对它们进行从大到小排序,如果有相同日期,则按身份证号码从大到小进行排序。身份证号码为18位的数字组成,出生日期为第7到第14位 

Input

第一行一个整数n,表示有n个身份证号码 ,余下的n行,每行一个身份证号码。 

数据规模和约定 n< =100000 

Output

按出生日期从大到小排序后的身份证号,每行一条 

Sample Input

5 
466272307503271156 
215856472207097978 
234804580401078365 
404475727700034980 
710351408803093165 

Sample Output

404475727700034980 
234804580401078365 
215856472207097978 
710351408803093165 
466272307503271156 

考察结构体排序,可以用字符串来排序,也可以用8位长整型来排序。

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


G题: 严格递增序列

Description

Zj常常和数字串打交道,最近他遇到了这个问题:向一个数字串插
入若干个逗号,使得该数字串成为一个严格递增的数列且分成的数的个数最多,在这个问题中,前导的零是允许出现在数的前面的。来试一试吧!

Input

第一个N 表示随后有N 行测试数据(1=<N<=1000) 每个测试数据为一
行包含一个长度不超过80 的数字串

Output

按次序输出严格递增且分成的数的个数最多,相邻两个数之间用一个逗号隔开,如果有多个数列满足要求,则输出第一个数最小的那个数列,若这样的解还不止一个,则输出第二个数最大的那个数列,以此类推。

Sample Input

2
0123456789
125123123

Sample Output

0,1,2,3,4,5,6,7,8,9
1,2,5,12,3123

贪心思想。我刚看到这道题的时候,是校赛前一天晚上的夜里一点钟,当时脑袋晕晕地随手用JAVA写了一下,居然WA了。。。昨天校赛,我在中午吃饭的时候,又抽空写了一遍,居然又WA了,但我知道了我有哪些情况没考虑到,不过当时有了思路后,由于太忙了一直没有时间写,今天中午有空了,就写了这道题,居然一遍过~呵呵

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


H题:修路

Description

N个村庄,编号从1N,你应该建一些道路,使得每两个村庄都可以相互连通。我们说两个村庄A和B是连通的,是指,在A和B之间有一条路,或者存在一个村庄C,A与C之间有路,C与B之间有路。

即,如果村庄A和B是直接相连或者是通过其他的村庄相连,则A和B就是连通的。

我们知道在一些村庄之间已经存在道路,你的工作就是再修建一些道路,使得所有的村庄都能连接起来,并且所修的道路的长度都是最小的。

Input

第一行是一个整数N (3 <= N <= 100),即村庄的数目。然后是N行,其中的i-th包含N个整数,而这些N个整数的j-th是距离(距离应该是一个整数,在[1,1000])之间的村庄i和村庄j。

然后是整数Q (0 <= Q <= N * (N + 1) / 2),然后是Q行,每一行包含两个整数a和b (1 <= a < b <= N),这意味着a村和b村之间的道路已经建立。

Output

您应该输出一行包含一个整数,这是所有要构建的道路的长度,这样所有的村庄都是连接的,并且这个值是最小的。

Sample Input

3
0 990 692
990 0 179
692 179 0
1
1 2

Sample Output

179

这道题是Prim算法或者是Kruskal算法的模板题,求最小生成树。关键点在于要将已经存在两点之间的路的长度设为0。即:a[i][j] = 0; a[j][i] = 0;i 到 j 与 j 到 i 的距离都要设为0

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


I题: n皇后问题

Description

经典的n皇后问题,在一个n*n的棋盘上放置n个皇后,使得不能互相攻击到,皇后的攻击范围的同一行,同一列以及同一个斜线。要求输出所有不会互相攻击到的摆放方式的总数目,以及每种摆放方式。所有通过旋转,对称都方式得到的摆放方式均认为是不同的摆放方式。棋盘被编号为0到n-1行,为0到n-1列。 

Input

皇后的数目n

Output

第一行输出不同的摆放方式总数。
之后的每行一个数字代表摆放方式,当n为8时,如01234567代表从第0行放在0列,第1行放在1列,第2行放在2列,按照升序输出。 

Sample Input

4

Sample Output

2
1302
2031

深搜一下。经典的8皇后问题。

点击此处查看本题的C++源码

点击此处查看本题的JAVA源码


J题: 最大炮兵数

Description

一个M*N的地图由M行N列组成,司令部的将军们打算在M*N的网格地图上部署他们的炮兵部队。地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 
![img](https://img-blog.csdn.net/20180422171410870?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2phbDUxNzQ4NjIyMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。 

Input

第一行包含两个由空格分割开的正整数,分别表示M和N; 
接下来的M行,每一行含有连续的N个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。M <= 100N <= 10。
多组输入,输入直到文件尾。

Output

一个整数K,表示最多能摆放的炮兵部队的数量。

Sample Input

5 4
PHPP
PPHH
PPPP
PHPP
PHHP

Sample Output

6

动态规划。这是我之前寒假复习动态规划时在poj上遇到的一道题,当时还写了题解,点此查看https://blog.csdn.net/jal517486222/article/details/79354695

点击此处查看本题的C++源码

比赛现场:
这里写图片描述
这里写图片描述

最终成绩如下:
grade

猜你喜欢

转载自blog.csdn.net/jal517486222/article/details/80040249