Poj 1054 The Troublesome Frog / OpenJudge 2812 恼人的青蛙
1.链接地址:
http://poj.org/problem?id=1054
http://bailian.openjudge.cn/practice/2812
2.题目:
- 总时间限制:
- 10000ms
- 内存限制:
- 65536kB
- 描述
- 在韩国,有一种小的青蛙。每到晚上,这种青蛙会跳越稻田,从而踩踏稻子。农民在早上看到被踩踏的稻子,希望找到造成最大损害的那只青蛙经过的路径。每只青蛙总是沿着一条直线跳越稻田,而且每次跳跃的距离都相同。
如下图所示,稻田里的稻子组成一个栅格,每棵稻子位于一个格点上。而青蛙总是从稻田的一侧跳进稻田,然后沿着某条直线穿越稻田,从另一侧跳出去
如下图所示,可能会有多只青蛙从稻田穿越。青蛙的每一跳都恰好踩在一棵水稻上,将这棵水稻拍倒。有些水稻可能被多只青蛙踩踏。当然,农民所见到的是图4中的情形,并看不到图3中的直线,也见不到别人家田里被踩踏的水稻,。
根据图4,农民能够构造出青蛙穿越稻田时的行走路径,并且只关心那些在穿越稻田时至少踩踏了3棵水稻的青蛙。因此,每条青蛙行走路径上至少包括3棵被踩踏的水稻。而在一条青蛙行走路径的直线上,也可能会有些被踩踏的水稻不属于该行走路径
①不是一条行走路径:只有两棵被踩踏的水稻;
②是一条行走路径,但不包括(2,6)上的水道;
③不是一条行走路径:虽然有3棵被踩踏的水稻,但这三棵水稻之间的距离间隔不相等。请你写一个程序,确定:在一条青蛙行走路径中,最多有多少颗水稻被踩踏。例如,图4的答案是7,因为第6行上全部水稻恰好构成一条青蛙行走路径。
- 输入
- 从标准输入设备上读入数据。第一行上两个整数R、C,分别表示稻田中水稻的行数和列数,1≤R、C≤5000。第二行是一个整数N,表示被踩
踏的水稻数量,
3≤N≤5000。在剩下的N行中,每行有两个整数,分别是一颗被踩踏水稻的行号(1~R)和列号(1~C),两个整数用一个空格隔开。而且,每棵被踩踏
水稻只被列出一次。- 输出
- 从标准输出设备上输出一个整数。如果在稻田中存在青蛙行走路径,则输出包含最多水稻的青蛙行走路径中的水稻数量,否则输出0。
- 样例输入
6 7
14
2 1
6 6
4 2
2 5
2 6
2 7
3 4
6 1
6 2
2 3
6 3
6 4
6 5
6 7- 样例输出
7- 来源
- 1054
3.思路:
枚举,数据量较大,要做优化
首先要判断是否可能为步数最多的,不可能则跳过无需判断
4.代码:
#include <iostream>
#include <cstdio>
#include <cstdlib> using namespace std; struct STEP
{
int x;
int y;
}; int cmp(const void *a,const void *b)
{
STEP step1 = *((STEP *)a);
STEP step2 = *((STEP *)b);
if(step1.x == step2.x) return step1.y - step2.y;
else return step1.x - step2.x;
} int main()
{
int i,j; int r,c;
cin>>r>>c; int n;
cin>>n;
STEP *steps = new STEP[n]; for(i = ; i < n; ++i)
{
cin>>steps[i].x>>steps[i].y;
}
qsort(steps,n,sizeof(STEP),cmp); int dx,dy,dx0,dy0,dxk,dyk;
int max = ;
int count;
for(i = ;i < n-; ++i)
{
for(j = i + ; j < n; ++j)
{
dx = steps[j].x - steps[i].x;
dy = steps[j].y - steps[i].y; dx0 = steps[i].x - dx;
dy0 = steps[i].y - dy;
if((dx0 > && dx0 <= r) && (dy0 > && dy0 <= c)) continue; dxk = dx0 + (max + ) * dx;
dyk = dy0 + (max + ) * dy;
if(dxk <= || dxk > r || dyk <= || dyk > c) continue; dxk = steps[j].x + dx;
dyk = steps[j].y + dy;
count = ;
while((dxk > && dxk <= r) && (dyk > && dyk <= c))
{
STEP step;
step.x = dxk;
step.y = dyk; if(bsearch(&step,steps,n,sizeof(STEP),cmp) == NULL) break; count++;
dxk += dx;
dyk += dy;
}
if(!((dxk > && dxk <= r) && (dyk > && dyk <= c)))
{
if(count > max && count > ) max = count;
}
}
}
cout<<max<<endl; delete [] steps;
return ;
}
Poj 1054 The Troublesome Frog / OpenJudge 2812 恼人的青蛙的更多相关文章
- POJ 1054 The Troublesome Frog
The Troublesome Frog Time Limit: 5000MS Memory Limit: 100000K Total Submissions: 9581 Accepted: 2883 ...
- (中等) POJ 1054 The Troublesome Frog,记忆化搜索。
Description In Korea, the naughtiness of the cheonggaeguri, a small frog, is legendary. This is a we ...
- POJ 1054 The Troublesome Frog(枚举+剪枝)
题目链接 题意 :给你r*c的一块稻田,每个点都种有水稻,青蛙们晚上会从水稻地里穿过并踩倒,确保青蛙的每次跳跃的长度相同,且路线是直线,给出n个青蛙的脚印点问存在大于等于3的最大青蛙走的连续的脚印个数 ...
- poj 1054 The Troublesome Frog (暴力搜索 + 剪枝优化)
题目链接 看到分类里是dp,结果想了半天,也没想出来,搜了一下题解,全是暴力! 不过剪枝很重要,下面我的代码 266ms. 题意: 在一个矩阵方格里面,青蛙在里面跳,但是青蛙每一步都是等长的跳, 从一 ...
- POJ - 1054 The Troublesome Frog 模拟 枚举优化。
题意:有个R*C的格网.上面有若干个点,这些点可以连成一些直线,满足:这些点在直线上均匀排布(也就是间隔相等),直线的两段穿过网格(也就是第一个,最后一个在网格的边界附近) 求某条直线上最多的点数 题 ...
- POJ 1054 The Troublesome Frog 枚举
这个题分类是dp,想了一会没有想出来,就去看别人题解了.发现别人题解全是暴力枚举= =.复杂度超过 N^2,但可能是剪枝的作用,没有超时. 思路:将所有点按坐标由小到大排序.两两枚举点p1,p2,并判 ...
- 【POJ】1054 The Troublesome Frog
题目是非常经典的搜索+剪枝.题意简言之就是,青蛙需要沿着直线踩着踏点通过田地,并且踏点需要至少为3.问哪条路径青蛙踩坏的作物最多.很好的一个条件是青蛙每次移动都是等间距的.题目需要注意将其排序. #i ...
- POJ1054 The Troublesome Frog
题目来源:http://poj.org/problem?id=1054 题目大意: 有一种青蛙在晚上经过一片稻田,在庄稼上跳跃,会把庄稼压弯.这让农民很苦恼.我们希望通过分析青蛙跳跃的路径,找出对稻田 ...
- NOI题库1814 恼人的青蛙
1814:恼人的青蛙 总时间限制: 2000ms 单个测试点时间限制: 500ms 内存限制: 65536kB 描述 在韩国,有一种小的青蛙.每到晚上,这种青蛙会跳越稻田,从而踩踏稻子.农民在早上看到 ...
随机推荐
- Quartz管理类
package com.sihuatech.project.task.manager; import java.text.ParseException; import org.quartz.CronT ...
- ASP.net中的Cache使用介绍
1.1.1 摘要(http://www.cnblogs.com/rush/archive/2012/06/30/2571438.html) 最近我们的系统面临着严峻性能瓶颈问题,这是由于访问量增加,客 ...
- SCOM MP中的PowerShell脚本
该脚本可在MP中运行 #param ($file,$threshold) #此处可定义file 和 threshold 参数,该参数可以从脚本外部接收 $threshold = 10 $file = ...
- Chapter 1 Securing Your Server and Network(11):使用透明数据库加密
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38398813,专题文件夹:http://blog.csdn.net/dba_huangz ...
- 深刻理解Python中的元类(metaclass)
译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...
- 二、Socket之UDP异步传输文件
上一篇文章一.Socket之UDP异步传输文件中,实现了文件的基本传输,但是传输过程中的信息是看不到的,这一篇是对上一篇进行了一些改进,并且可以了解传输的信息(加入了Log),还加入了接收或者拒绝接收 ...
- Best Practice of cross-platform games
__super keyword this keyworld is offered only by Microsoft VC. So you had to call the very name of p ...
- Android 框架修炼-自己封装双缓存管理框架库
一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率 ...
- C++ (P70—P96)
1 类的成员默认为私有模型 2 类的声明内不允许对数据成员进行初始化 3 类的成员函数,如果在类外定义,只需在函数类型之前加上inline就为内联函数了,如果在类内定义函数则该函数自动成为内联成员函数 ...
- 关于Git的工作区域和对应的文件状态.
Git是一个免费的.分布式的版本控制工具,或是一个强调了速度快的源代码管理工具.每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖于网络和中心服务器. Git ...