zoukankan      html  css  js  c++  java
  • NOI题库1814 恼人的青蛙

    1814:恼人的青蛙

    总时间限制:

    2000ms

    单个测试点时间限制:

    500ms

    内存限制:

    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

    【思路】

      暴力枚举。

      1、存点后排序。

      2、暴力枚举前两个点确定直线并判断直线是否可行如果可行则更新ans

      需要注意:直线中如果有间断则直线不可行。

    【代码】

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 const int maxn = 5000+10;
     7 struct Node{
     8     int x,y;
     9     bool operator<(const Node&rhs) const{
    10        return x<rhs.x || (x==rhs.x && y<rhs.y);
    11     }
    12 }nodes[maxn];
    13 bool vis[maxn][maxn];
    14 int n,m,p;
    15 
    16 bool inside(int x,int y) {
    17     return x>=1 && x<=n && y>=1 && y<=m;
    18 }
    19 
    20 int main() {
    21     scanf("%d%d%d",&n,&m,&p);
    22     for(int i=0;i<p;i++) {
    23         scanf("%d%d",&nodes[i].x,&nodes[i].y);
    24         
    25         vis[nodes[i].x][nodes[i].y]=1;
    26     }
    27     sort(nodes,nodes+p);
    28     int ans=0;
    29     for(int i=0;i<p;i++)
    30        for(int j=i+1;j<p;j++) {
    31                int dx=nodes[j].x-nodes[i].x,dy=nodes[j].y-nodes[i].y;
    32                if(inside(nodes[i].x-dx,nodes[i].y-dy)) continue;  
    33                int xx=nodes[j].x+dx,yy=nodes[j].y+dy;
    34                if(!inside(xx,yy)) continue;
    35                int cnt=2;
    36                while(inside(xx,yy)){
    37                    if(vis[xx][yy]) cnt++;
    38                    else {
    39                        cnt=0;
    40                     break;     
    41                 }
    42                    xx+=dx,yy+=dy;
    43             }
    44             ans=max(ans,cnt);
    45        }
    46     printf("%d
    ",ans);
    47     return 0; 
    48 }
  • 相关阅读:
    SVM高斯核为何会将特征映射到无穷维?【转载】
    sklearn.svm.LinearSVC文档学习
    NgDL:第四周深层神经网络
    Py中的矩阵乘法【转载】
    NN中BP推导及w不能初始化为0
    L2-006 树的遍历
    P3144 关闭农场 并查集 反向
    P1197 [JSOI2008]星球大战 并查集 反向
    P2700 逐个击破 最小生成树
    L2-005 集合相似度
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4935797.html
Copyright © 2011-2022 走看看