CodeForces 575DTablecity 奇偶分析

来源:互联网 发布:九维网络免费wifi官网 编辑:程序博客网 时间:2024/06/11 07:22

首先这个题目的要求是:找到一种监测方法,使得所有小偷移动序列中 一定会有至少 一个时间点 在 一个地点 与之重合。


这个题可不能从左往右扫一遍,因为即使只这样,小偷也会跑过去。

/*

我们先试着确定小偷的范围,将其渐渐逼死,结果很没有头绪,因为这样的小偷是"万能",即出生位置可以不断调整来始终破坏这个策略。


但这样分析是不对的,因为小偷只可能有一个出生位置。*/


解法:

从左往右扫列,再从右往左扫列。


2000步,即可抓住。


因为:

小偷之所以能“迎面逃走”,是因为小偷所在列的奇偶性和查看的列不同。

如果两者相同,绝不可能迎面逃走。


所以如果小偷出生在奇数列,你第一遍从左往右扫,那么扫到第1000列之前,一定能抓住他,因为每次都是同奇偶。


如果小偷出生在偶数列,第一次从左往右抓不到他,但是1001次,你监测1000列,你在偶数列,他也在偶数列,

现在从右往左扫,因为你们每步同奇偶,所以一定能在2000步之前抓住他。除非他每次能走2列,但那不可能,因为

那就像他长了翅膀会飞一样。




#include<bits/stdc++.h>using namespace std;#define all(x) (x).begin(), (x).end()#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)typedef long long ll;typedef pair<int, int> pii;const int INF =0x3f3f3f3f;const int n=1000    ;int main(){    printf("2000\n");     for(int x=1;x<=n;x++)     {        printf("%d %d %d %d\n",x,1,x,2);     }        for(int x=n;x>=1;x--)     {        printf("%d %d %d %d\n",x,1,x,2);     }   return 0;}


0 0
原创粉丝点击