Content

你有一个长度为 \(n\) 的数组 \(a\),初始时,\(\forall i\in[1,n]\),\(a_i=i\)。

每次操作选择两个数 \(x,y(1\leqslant x,y\leqslant n,x\neq y)\),然后将 \(a_x\) 转换为 \(\left\lceil\dfrac{a_x}{a_y}\right\rceil\)。你需要执行不超过 \(n+5\) 次操作将数组 \(a\) 转换为一个包含 \(n-1\) 个 \(1\) 和 \(1\) 个 \(2\) 的数组。请给出一个构造方案。

数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 10^3\),\(3\leqslant n,\sum n\leqslant 2\times 10^5\)。

Solution

不难想到的做法是,\(\forall i\in[3,n)\),每次将 \(a_i\) 转换为 \(\left\lceil\dfrac{a_i}{a_{i+1}}\right\rceil\)。可以证明,由于 \(a_i<a_{i+1}\),所以转换的结果必然为 \(1\)。然后我们再用剩下的 \(2\) 不断的去除 \(n\) 直到 \(n\) 变成 \(1\) 为止。操作数约为 \(n+\log n\),而 \(\log n\) 最大值显然会超过 \(5\),因此是不可行的。考虑如何优化这个操作方案。

我们发现,拿 \(\left\lceil\sqrt{n}\right\rceil\) 去除 \(n\) 最多仅需 \(2\) 次就可以将 \(n\) 变成 \(1\),因此,我们不妨把 \([\left\lceil\sqrt{n}\right\rceil,n]\),\([\left\lceil\sqrt{\left\lceil\sqrt{n}\right\rceil}\right\rceil,\left\lceil\sqrt{n}\right\rceil]\),\(\dots\) 等部分分成一段(注意 \(1,2\) 不能被分到任何一段中去),对于每一段,我们先把中间的所有元素全拿最后一个元素去除使它门全部都变成 \(1\),然后再去拿最左边的元素去除以最右边的元素 \(2\) 次,即可做到使一段里面的元素全部变成 \(1\)。

然后这道题目就可以过了。

Code

namespace Solution {
const int N = 2e5 + 7;
int n;
struct node {int x, y;};
vector<node> ans; ii checksq(int x) {
int sqrtx = sqrt(x);
return sqrtx * sqrtx == x;
} iv Main() {
MT {
read(n), ans.clear();
int cur = sqrt(n) + !checksq(n), precur = n, fl = 0;
while(precur > 2) {
F(int, i, cur + 1, precur - 1) ans.push_back((node){i, precur});
F(int, i, 1, 2) ans.push_back((node){precur, cur});
precur = cur, cur = sqrt(precur) + !checksq(precur);
}
int cnt = ans.size(); println(cnt);
F(int, i, 0, cnt - 1) printf("%d %d\n", ans[i].x, ans[i].y);
}
return;
}
}

最新文章

  1. 关于for循环------swift3.0
  2. [参考]wget下载整站
  3. DHTML 教程学习进度备忘
  4. [Everyday Mathematics]20150207
  5. MyBatis之一:入门
  6. Android实例-TTabControl的使用(XE8+小米2)
  7. hadoop集群环境搭建准备工作
  8. OCP-1Z0-051-名称解析-文章32称号
  9. 4D(DRG、DLG、DOM、DEM)数据 概念
  10. django-xadmin列表页filter关联对象搜索问题
  11. 201521123109 《java程序设计》第12周学习总结
  12. oracle篇 之 组函数
  13. Linux find常用用法示例
  14. spiflash
  15. 【转】【测试用例设计】WEB通用测试用例
  16. AC Challenge(状压dp)
  17. babel 基本
  18. leetcode367--Valid Perfect Square
  19. [原]巧用RenderTexture
  20. 部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930;

热门文章

  1. SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 基本流程讲解(3)
  2. js数组常用添加方法有两种
  3. azkaban执行任务长时间无法结束
  4. VS Code 配置和使用
  5. FESTUNG — 3. 采用 HDG 方法求解对流问题
  6. [R]在dplyr基础上编写函数-(1)eval
  7. Vue 前端配置多级目录实践(基于Nginx配置方式)
  8. Redis | 第11章 服务器的复制《Redis设计与实现》
  9. Spark(十二)【SparkSql中数据读取和保存】
  10. Java Swing布局管理器GridBagLayout的使用示例 [转]