讨论 / 求题解,或思路,宁波市25届中小学生计算机程序设计 2 到 4 题。
dlake 2010-07-02 19:19:00
点我顶贴 收藏 删除
2. 方格稿纸 (paint)

【题目描述】

小猪在小学中认识了很多的字,终于会写一点作文了。某天小猪买了一张方格稿纸来写作文,n行m列,形状如下所示:

上图中n=m=5。

某天小猪的邻居小小猪来小猪家玩,用黑墨水笔把小猪新买的方格稿纸涂黑了很多格子。每个格子不是完全黑色就是完全白色,如下图所示。

小猪不能责怪小小猪。作文写不成了,他觉得很无聊,就开始数里面有多少魔幻方阵。

如果稿纸中一个k×k的正方形区域满足以下两个条件,那么它就是魔幻方阵:

1.黑白格子的数量差不能超过1;

2.k不能小于2。

上图染色后的方格稿纸共有9个魔幻方阵(6个2×2的魔幻方阵,3个3×3的魔幻方阵),现在请你帮小猪求出他被染色的稿纸里面有多少个魔幻方阵。

【输入】

输入文件paint.in中的第一行有二个正整数n和m(互相之间以一个空格分隔),表示稿纸共有n行m列。

接下来n行,每行有m个0或1的整数(互相之间以一个空格分隔),代表每个格子的颜色。如果这个数是1则为黑色,是0则为白色。

【输出】

输出文件paint.out中仅有一行,该行只有一个整数,表示稿纸中魔幻方阵的个数。

【样例输入】

5 5

1 0 1 1 1

1 0 1 0 1

1 1 0 1 1

1 0 0 1 1

1 1 1 1 1

【样例输出】

9

【数据规模】

50%的数据,1≤n≤10,1≤m≤10;

75%的数据,1≤n≤180,1≤m≤180;

100%的数据,1≤n≤300,1≤m≤300。

3. 教室外的风景 (scene)

【题目描述】

小猪上初中了,初中真好啊,有很多自修课哦。很多同学喜欢在自修课时到教室外面去,说是到老师那问问题J。

学校规定,自修课到教室外去的每个同学都必须做好登记,每次进出教室的登记是以一对整数a和b来描述的,表示某一个同学在时刻a时到教室外面,在时刻b以后回到教室内。也就是说在时刻a至时刻b的这段时间中,这个登记的同学一直在教室外面。

校长想知道最多有多少同学在同一时刻都在教室外面,但同学们进进出出教室的记载实在很乱,于是校长请参加信息学兴趣小组的小猪来统计。

【输入】

输入文件scene.in中的第一行只有一个整数n,表示共有n个同学进出教室的记载。

接下来n行,每行二个整数a和b,表示有一个同学在第a时刻出了教室,他在第b时刻后回到教室。

【输出】

输出文件scene.out中仅有一行,该行只有一个整数,表示最多有多少同学在同一时刻都在教室外面。

【样例输入】

4

2 6

8 9

1 5

1 2

【样例输出】

3

【样例说明】

第一个同学在时刻2到教室外面,在时刻6后回到教室;

第二个同学在时刻8到教室外面,在时刻9后回到教室;

第三个同学在时刻1到教室外面,在时刻5后回到教室;

第四个同学在时刻1到教室外面,在时刻2后回到教室;

因此在时刻2时,最多有3个同学(第一个、第三个和第四个)在教室外面。

【数据规模】

50%的数据中,1≤n≤1000;每个同学进出教室的时刻a和b满足:1≤a≤b≤1000;

100%的数据中,1≤n≤100000,1≤a≤b≤100000000。

4. 瓶子涂色 (bottle)

【题目描述】

小猪上小学的时候,一度对颜色非常感兴趣,虽然他的美术非常糟糕。

有一次他喝完n瓶饮料把透明的瓶子排成一排,想把这些饮料瓶子都涂上颜色。他觉得如果所有相邻的两个瓶子颜色都不一样的话会比较有趣。

他现在只有红色(Red)、绿色(Green)和蓝色(Blue)这三种颜料。由于瓶子的大小和表面材质不同,在不同的瓶子上涂不同的颜色需要的花费都不一样。小猪统计了一下,把第i个瓶子染成红色需要Ri元钱,染成绿色需要Gi元钱,染成蓝色需要Bi元钱。

现在请你帮他计算出要使相邻两个瓶子的颜色都不一样,他至少需要多少花费。

【输入】

输入文件bottle.in中的第一行只有一个整数n,表示共有n只瓶子。

第二行有n个正整数(以一个空格分隔),第i个数Ri表示把第i个瓶子染成红色需要Ri元钱。

第三行有n个正整数(以一个空格分隔),第i个数Gi表示把第i个瓶子染成绿色需要Gi元钱。

第四行有n个正整数(以一个空格分隔),第i个数Bi表示把第i个瓶子染成蓝色需要Bi元钱。

【输出】

输出文件bottle.out中仅有一行,该行只有一个整数,表示最小花费。

【样例输入】

5

1 3 1 2 2

1 2 3 4 3

4 2 1 5 3

【样例输出】

9

【数据规模】

30%的数据中,1≤n≤10;

70%的数据中,1≤n≤30;

100%的数据中,1≤n≤100000,1≤Ri, Gi, Bi≤100。

#1 naocan@2010-06-08 03:08:00
回复 删除
我也参加了 100多吧

最后一题用动归啊

#2 dlake@2010-06-08 23:23:00
回复 删除
[quote][url=/Redirect.asp?Act=Reply&DID=6049&RID=14869]原帖[/url]由 [i]naocan[/i] 于 2010-6-8 18:08:00 发表

我也参加了 100多吧

最后一题用动归啊[/quote]

说的具体点。动规我也知道。数据模型如何构建。

#3 wish@2010-06-10 06:31:00
回复 删除
写一点我的想法吧:

2.

范围只有300,考虑到一共只有 O(N^3) 个正方形,所以考虑枚举所有正方形,在 O(1) 时间判断每个正方形是否合法。

将输入中所有黑色格子标记为 1,所有白色格子标记为 -1。则一个正方形中黑白格子数量差不超过 1,等价于这个正方形内所有数字的和的绝对值不超过 1。

于是转化为求和问题。

比较简单的处理方法是用部分和优化。记 Sum(i, j) 表示 (1, 1) 到 (i, j) 这个区域所有数字的和(规定 Sum(i, 0) = Sum(0, j) = 0)。

则区域 (x0, y0) - (x1, y1) 的和为 Sum(x1, y1) - Sum(x0 - 1, y1) - Sum(x1, y0 - 1) + Sum(x0 - 1, y0 - 1)

3.

做离散化,把所有同学离开教室和回到教室的时间点拆开并标记、排序。之后按照时间顺序枚举时间点模拟同学进出,更新最大值即可。时间复杂度 O(N + 排序时间)

4.

动态规划。设 F(i, C) 为前 i 只瓶子,第 i 个染成 C (=0,1,2) 色的最小花费。

转移方程:

F(i, C) = min{F(i - 1, C0)} + Cost(i, C) (其中 C0 不等于 C,Cost(i, C) 表示第 i 个瓶子染成 C 色的花费)

边界:

F(0, C) = 0

最后输出 max{F(N, 0), F(N, 1), F(N, 2)}。

时间复杂度 O(N)。

#4 dlake@2010-06-10 19:35:00
回复 删除
[quote][url=/Redirect.asp?Act=Reply&DID=6049&RID=14896]原帖[/url]由 [i]wish[/i] 于 2010-6-10 21:31:00 发表

写一点我的想法吧:

2.

范围只有300,考虑到一共只有 O(N^3) 个正方形,所以考虑枚举所有正方形,在 O(1) 时间判断每个正方形是否合法。

将输入中所有黑色格子标记为 1,所有白色格子标记为 -1。则一个正方形中黑白格子数量差不超过 1,等价于这个正方形内所有数字的和的绝对值不超过 1。

于是转化为求和问题。

比较简单的处理方法是用部分和优化。记 Sum(i, j) 表示 (1, 1) 到 (i, j) 这个区域所有数字的和(规定 Sum(i, 0) = Sum(0, j) = 0)。

则区域 (x0, y0) - (x1, y1) 的和为 Sum(x1, y1) - Sum(x0 - 1, y1) - Sum(x1, y0 - 1) + Sum(x0 - 1, y0 - 1)

3.

做离散化,把所有同学离开教室和回到教室的时间点拆开并标记、排序。之后按照时间顺序枚举时间点模拟同学进出,更新最大值即可。时间复杂度 O(N + 排序时间)

4.

动态规划。设 F(i, C) 为前 i 只瓶子,第 i 个染成 C (=0,1,2) 色的最小花费。

转移方程:

F(i, C) = min{F(i - 1, C0)} + Cost(i, C) (其中 C0 不等于 C,Cost(i, C) 表示第 i 个瓶子染成 C 色的花费)

边界:

F(0, C) = 0

最后输出 max{F(N, 0), F(N, 1), F(N, 2)}。

时间复杂度 O(N)。

[/quote]

谢谢兄台。先按兄台思路,尝试一下,待解决后分数送上。

#5 dlake@2010-06-28 21:11:00
回复 删除
[quote][url=/Redirect.asp?Act=Reply&DID=6049&RID=14902]原帖[/url]由 [i]dlake[/i] 于 2010-6-11 10:35:00 发表

谢谢兄台。先按兄台思路,尝试一下,待解决后分数送上。[/quote]再次感谢兄台,按照兄台给的思路,题目已做出,分数附上

#6 931903999@2010-06-28 22:57:00
回复 删除
这是小学组的呀呀.只要最后一题加动归,第二,三题拿个一半,一等奖不是问题吧.

但想要4个AC,就难了.

我的结果(比赛)

2.AAAAATTTTTAAAAAAAAAA(N^3也有27000000了,是C++和FP的差距?)

3.AAAAABBBBB(崩溃)

4.AAAWWWWWWAAAAAAAAAAA(动归一个地方打错了)

#7 dlake@2010-07-02 19:18:00
回复 删除
回复 地下室dlake 的帖子

请问兄弟你有测试数据?

发我一份可否?我的QQ40144803

#8 dlake@2010-07-02 19:19:00
回复 删除
[quote][url=/Redirect.asp?Act=Reply&DID=6049&RID=15069]原帖[/url]由 [i]dlake[/i] 于 2010-6-29 12:11:00 发表

再次感谢兄台,按照兄台给的思路,题目已做出,分数附上[/quote]

查看更多回复
提交回复