题目链接https://codeforc.es/contest/1067/problem/C

题意:有一个无限大的棋盘,棋盘上初始放置了\(n\)个国际象棋马。如果某一个格子没有放马且能够被\(4\)个及以上的马经一步走到,那么这个格子也会放一个马。(如下图,初始的7个马为绿色,然后我们发现可以在红色区域再放一个马,在红色区域放置后,蓝色区域也应该再放一个马,总共9个)构造一种初始\(n\)个马的放置方案,使得棋盘上最终马的数量大于\(\lfloor\frac{n^2}{10} \rfloor\)。

分析:一道相当有趣的构造。构造的关键在于我们如何去考虑这个\(\lfloor \frac{n^2}{10} \rfloor\)。首先先考虑一个国际象棋马能到达那些位置。如下图。

显然我们至少在黄色块中选择4个才能在绿色区域中放置一个马。于是我们应尽可能让这些红色区域连续出现,于是出现了一个最简单的构造,如下。

我们把这n个马均匀地分成两行放置(绿色区域)。那么问题来了,这种状态究竟能生成多少个马。观察上图,我们发现这个构造生成的马数呈等差数列关系。原先每行有\(\frac{n}{2}\)个马,而第一次生成马新增了\(2\cdot (\frac{n}{2} - 4)\)个马,第二次则是\(2\cdot (\frac{n}{2} - 8)\),……

因此生成的总数为\(2\sum (\frac{n}{2} - 4i) = 2\cdot \frac{\frac{n}{2}(\frac{n}{2}\cdot \frac{1}{4})}{2} = \frac{n^2}{16}\)。因此这种构造的生成数不够,但是这个构造足以给我们启发,像这类向两侧生成的构造能够产生\(c\cdot n^2\)数量的马。于是我们考虑每一行最少几个马最终生成的数量才能多于\(\lfloor \frac{n^2}{10} \rfloor\)。

解不等式:\(2\sum (an- 4i)\leq \frac{n^2}{10}\)。

得到\(a\geq \frac{\sqrt{10}}{5}\)。于是我们需要构造一种新的方案使得每一行的马数能超过\(\frac{\sqrt{10}}{5}\)。如果对数字敏感一些则可发现\(\frac{2}{3}\geq \frac{\sqrt{10}}{5}\),因此我们的目标就是构造出一种每行至少存在\(\frac{2n}{3}\)个马的方案。

于是我们看到了上图这种构造。每一行的马数量大约为\(\frac{n}{3}\)。虽然数量不够但我们马上可以发现这张图的很多地方都能放上一些马,如下。

 

每一行的个数上升到了\(\frac{2n}{3}-4\)。在忽略常数和一次项的影响后,总马数约为\(\frac{n^2}{8}\)。

 

AC代码

#include<bits/stdc++.h>
#define rep(i, a, b) for(int i = a; i <= b; ++i)
using namespace std;
typedef long long ll;
void io() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
ll n;
int main() {
io(); cin >> n;
rep(i, 1, n) cout << 2 * i / 3 << ' ' << 2 * i % 3 << endl;
}

CF1067C Knights 构造的更多相关文章

  1. Educational Codeforces Round 73 (Rated for Div. 2) B. Knights(构造)

    链接: https://codeforces.com/contest/1221/problem/B 题意: You are given a chess board with n rows and n ...

  2. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  3. Knights of the Round Table-POJ2942(双连通分量+交叉染色)

    Knights of the Round Table Description Being a knight is a very attractive career: searching for the ...

  4. CF994B Knights of a Polygonal Table 第一道 贪心 set/multiset的用法

    Knights of a Polygonal Table time limit per test 1 second memory limit per test 256 megabytes input ...

  5. POJ2942 UVA1364 Knights of the Round Table 圆桌骑士

    POJ2942 洛谷UVA1364(博主没有翻墙uva实在是太慢了) 以骑士为结点建立无向图,两个骑士间存在边表示两个骑士可以相邻(用邻接矩阵存图,初始化全为1,读入一对憎恨关系就删去一条边即可),则 ...

  6. 学习笔记:Maven构造版本号的方法解决浏览器缓存问题

    需要解决的问题 在做WEB系统开发时,为了提高性能会利用浏览器的缓存功能,其实即使不显式的申明缓存,现代的浏览器都会对静态文件(js.css.图片之类)缓存.但也正因为这个问题导致一个问题,就是资源的 ...

  7. 一步步构造自己的vue2.0+webpack环境

    前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...

  8. About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

    构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种.特点:1:该函数的名称和所在类的名称相同.2:不需要定义返回值类型.3:该函数没有具体的返回值.记住:所有对象创 ...

  9. Eos开发——构造查询条件

    1.ajax 方式 var data = { orgid :orgid,year:year ,month: month,type:type,sortField:'sellEmpname' ,sortO ...

随机推荐

  1. Cleaning Data in R

    目录 R 中清洗数据 常见三种查看数据的函数 Exploring raw data 使用dplyr包里面的glimpse函数查看数据结构 \(提取指定元素 ```{r} # Histogram of ...

  2. 【转】Error,java对常量池来说字符串xxx的UTF8表示过长的解决及其理解

    做项目,客户端这里自己模拟json数据时,一时没忍住搞得json字符串太长了(idea上大概有600多行吧),这个问题就蹦出来了.老方法直接google.百度然后看到一堆有关String 字符串常量池 ...

  3. 题解【洛谷P1886】滑动窗口 /【模板】单调队列

    题面 单调队列模板题. 单调队列可以从队首和队尾出队. 队列中的元素大小具有一定的顺序. 具体可参考这一篇题解 #include <bits/stdc++.h> #define itn i ...

  4. Go_go build 和 go install

    1.作用 go build:用于测试编译包,在项目目录下生成可执行文件(有main包). go install:主要用来生成库和工具.一是编译包文件(无main包),将编译后的包文件放到 pkg 目录 ...

  5. Ehcache缓存数据

    1.ehcahe简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. 看到官网上已经3.0了. 2.作用 我把它当做一 ...

  6. MySQL加号+ 的作用

    案例:查询员工名和员工姓,连接成一个字段,并显示为: 姓名 SELECT last_name+first_name AS 姓名 FROM employees;没有报错但姓名一下全是0 Java中的 + ...

  7. beego登录退出与检查登录过滤器

    // ShowLogin 登陆显示 func (c *UserController) ShowLogin() { username := c.Ctx.GetCookie("username& ...

  8. wamp 安装

    下载地址:http://www.wampserver.com/ 安装 完成安装 安装目录下打开 安装成功

  9. HTML5学习(4)文本元素

    使用VSCode编辑器,内置emmet插件. ctrl+/ 注释/取消注释 ctrl+enter 新起一行 ctrl+shift+enter 往上新起一行 h$*4>lorem10 <h1 ...

  10. java位移运算符|And&,操作二进制

    在java中 逻辑运算符有四种:&  ,  |,  &&,  || &: 如果第一个条件是fasle,还会判断第二个条件,只要有一个条件不满足,结果就返回false; ...