枚举_百炼 2812 讨厌的青蛙

Posted mapreduce

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了枚举_百炼 2812 讨厌的青蛙相关的知识,希望对你有一定的参考价值。

 1 #define _CRT_SECURE_NO_WARNINGS  
 2 #include <stdio.h>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <stdlib.h>
 6 #include <vector>
 7 #include <map>
 8 #include <queue>
 9 #include <string>
10 #include <iostream>
11 #include <ctype.h>
12 #include <string.h>
13 #include <set>
14 #include <stack>
15 #include<functional>
16 using namespace std;
17 #define Size 5005
18 #define maxn  1<<30
19 #define minn  1e-6
20 /*
21 枚举的剪枝
22 */
23 struct E{
24     int x, y;
25 }a[Size];
26 int row, col,n;
27 int  cmp(const void*t, const void *s){
28     E *p1, *p2;
29     p1 = (E*)t;
30     p2 = (E*)s;
31     if (p1->x != p2->x) return p1->x - p2->x;
32     else return p1->y - p2->y;
33 }
34 int search(E t, int dx, int dy){
35     E temp;
36     temp.x = t.x + dx;
37     temp.y = t.y + dy; 
38     int steps = 2;
39     while (temp.x > 0 && temp.x <= row && temp.y > 0 && temp.y <= col){
40         if (!bsearch(&temp,a,n,sizeof(E),cmp)){
41             steps = 0;
42             break;
43         }
44         temp.x += dx;
45         temp.y += dy;
46         steps++;
47     }
48     return steps;
49 }
50 void solve(){
51     qsort(a, n, sizeof(E), cmp);
52     int maxi = 2, steps;
53     for (int i = 0; i < n - 1; i++)
54         for (int j = i + 1; j < n; j++){
55             E temp;
56             int dx = -a[i].x + a[j].x;
57             int dy = -a[i].y + a[j].y;
58             temp.x = a[i].x + maxi*dx;
59             temp.y = a[i].y + maxi*dy;
60             int px = a[i].x - dx;
61             int py = a[i].y - dy;
62             if (px>0&&px<=row&&py>0&&py<=col) continue;//如果上一个在稻田里面,那么说明这种情况已经枚举过了
63             if (temp.x > row) break;//如果和显存的最大一样的时候就以及超出了稻田的范围那么就 不用再判断了,肯定小于目前的答案
64             if (temp.y > col || temp.y <= 0) continue;//如果,y超出了界限肯定不是正确答案,注意,x的斜率一定是小于1的因为排序是按照x的非递减序列拍的,而y可以说是无序的,所以有斜率大于零与小于零的两种情况
65             steps = search(a[j], dx, dy);
66             if (steps > maxi) maxi = steps;
67 
68         }
69     if (maxi == 2) maxi = 0;
70     printf("%d\n", maxi);
71     return;
72 }
73 
74 int main(){
75     cin >> row >> col;
76     cin >> n;
77     for (int i = 0; i < n; i++){
78         cin >> a[i].x >> a[i].y;
79     }
80     solve();
81     system("pause");
82 }

 

以上是关于枚举_百炼 2812 讨厌的青蛙的主要内容,如果未能解决你的问题,请参考以下文章

pku_oj: w11-03讨厌的青蛙(C++枚举算法)

百练2812:恼人的青蛙

枚举_百炼 2811 熄灯问题 (美妙的枚举函数)

2812 恼人的青蛙(暴力搜索时根据问题优化判断条件以加快搜索速度)

[3.3校内训练赛]

省选模拟5