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 描述 在韩国,有一种小的青蛙.每到晚上,这种青蛙会跳越稻田,从而踩踏稻子.农民在早上看到 ...
随机推荐
- CAS Proxy 的相关文章
cas代理模式的原理及配置 http://my.oschina.net/mashiguang/blog/69312 剖析CAS Proxy的设计原理 http://www.blogjava.net/s ...
- cocos2dx中android下动态更新.so文件
作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4037595.html 因为没用lua脚本写游戏,所以每次发布出去后,发现在bug,需要 ...
- 某项目 需要在UITabbar 上显示小红点,在此搜罗了三个方法。
1.使用系统自带的,并且可以在小红点上显示数字. [itemOne setBadgeValue:@""]; //显示不带数字的小红点 [itemOne setBadgeValue: ...
- 从零开始学android开发-Json转换利器Gson之实例
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: h ...
- Android手机中获取手机号码和运营商信息
代码如下: package com.pei.activity; import android.app.Activity; import android.os.Bundle; import androi ...
- 读 Runtime 源码:对象与引用计数
以前只是看了很多博客,这次打算看一下源码,并记录下来.想到哪里就读到哪里,写到哪里.读的代码版本是:objc runtime 680,可以从这里下载 https://github.com/RetVal ...
- 【转】Android LruCache源码介绍
本文来源:转载自: http://blog.csdn.net/linghu_java/article/details/8574102 package android.util; import java ...
- [转]javascript指定事件处理程序包括三种方式:
javascript指定事件处理程序包括三种方式: (1):DOM0级事件处理程序 如: 代码如下: var btn=document.getElementById("mybtn" ...
- windows下mysql初始密码设置
转载自:http://blog.csdn.net/ofreelander/article/details/50802780 1.my-default.ini 改名my.ini 在解压的目录下面复制my ...
- C语言内存四区
按照老版操作系统来学习,内存对于程序来讲分四区.分别是 代码区,静态区,栈,堆. 由上面程序执行的结果可知: 貌似结果就是 静态代码堆栈 静态区存放的是程序中所有静态变量和常量的值.静态区的大小是程序 ...


