首页 > 其他分享 >Codeforces Round 787 (Div. 3) B. Make It Increasing

Codeforces Round 787 (Div. 3) B. Make It Increasing

时间:2023-09-13 18:44:08浏览次数:37  
标签:std 787 int Make Codeforces 数组 递增

给一个长为 \(n\) 的数组 \(a_1, a_2, \cdots, a_n \quad (0 \leq a_i \leq 10^9)\) 。可以执行以下操作任意次:

  • 选择任意一个 \(a_i\) 并且执行 \(a_i = \lfloor \frac{a_i}{2} \rfloor\) 。

输出最小操作次数,使得数组所有元素变为严格递增。

观察:数组一些位置变小,将数组变为严格递增。右端点的 \(a_n\) 不变最优。

  • 当 \(n = 1\) ,数组严格递增。
  • 当 \(n \geq 2\) ,从 \(n - 1\) 开始往前扫,保证每个 \(a_i < a_{i + 1}\) 。当且仅当 \(a_{i + 1} == 0\) ,无法通过操作使得 \(a_i < a_{i + 1}\) 。(由于 \(n = 1\) 时被另外判断可以保证 \(i + 1\) 位置合法)
  • 复杂度保证:任意 \(a_i\) 最多执行 \(\log_2 {10^9} = 30\) 次操作,时间复杂度为 \(O(n)\) 。
view
#include <bits/stdc++.h>
void solve() {
	int n; std::cin >> n;
	std::vector<int> a(n+1);
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	if (n == 1) std::cout << 0 << '\n';
	else {
		int cnt = 0;
		for (int i = n - 1; i; --i) {
			if (a[i + 1] == 0) {
				std::cout << -1 << '\n';
				return;
			}
			while (a[i] && a[i] >= a[i + 1]) {
				a[i] /= 2; cnt++;
			}
		}
		std::cout << cnt << '\n';
	}
}
signed main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
} 

标签:std,787,int,Make,Codeforces,数组,递增
From: https://www.cnblogs.com/zsxuan/p/17700012.html

相关文章

  • c/c++ 混合编译makefile
    CC=gccC++=g++LINK=g++INCLUDES=-L.-IsconvLIBS=-lz-lmCCFLAGS=$(COMPILER_FLAGS)--std=c99-c-g-MMD-MP$(DEFINES)C++FLAGS=$(COMPILER_FLAGS)-std=c++11-c-g-O2-W-WallTARGET=222CFILES=sconv/sconv.cC++FILES=2.cppOBJ......
  • Codeforces Round 791 (Div. 2) A. AvtoBus
    已知有\(n\)个轮子,会有一个车队车来换轮,且恰好使用完这些轮子。只知道这些车中有\(4\)轮车和\(6\)轮车。你需要估计这个车队最少可能有多少车和最多可能有多少车,或判断这是完全不可能的。观察:\(4x+6y=n\),由裴蜀定理,当\(2\midn\)有解且\(2x+3y=\frac{n}{2}\)......
  • Makefilre
    Cmake实践CURL:是利用URL语法在命令行下工作的传输工具cmake是跨平台项目管理工具,它用更抽象的语法来组织项目。虽然,仍然是目标,依赖之类的东西,但更为抽象和友好,比如你可用math表示数学库,而不需要再具体指定到底是math.dll还是libmath.so,在windows下它会支持生成visualstudio的工......
  • Codeforces Round 897 (Div. 2)
    目录写在前面ABCDE1/E2F写在最后写在前面比赛地址:https://codeforces.com/contest/1867。简略题解。还好没掉分。A令原数列中第\(k\)大对应\(k\)即可。///*By:Luckyblock*/#include<bits/stdc++.h>#defineLLlonglongconstintkN=4e4+10;//============......
  • 【题解】Educational Codeforces Round 141(CF1783)
    评价:educationalA.MakeitBeautiful题目描述:如果一个数组中存在一个数恰好等于该数前面所有数之和,那么这个数组就是丑的。如果一个数组不是丑的,就是美的。比如说:数组$[6,3,9,6]$是丑的,因为\(9=6+3\);数组$[5,5,7]$是丑的,因为第二个\(5=5\)。数组$......
  • Codeforces Round 897 (Div. 2)
    F.MostDifferentTree当\(n=2\)时,只能构造一条长度为\(2\)的链。当\(n\ge3\)时,对于\(i\)\((1\lei\len)\),以\(i\)作为根的树记为\(h_i\),考虑枚举树找一个大小为\(s\)的树\(t\),使得不存在任何一个\(h_i=t\),且\(s\)尽可能小,然后从\(1\)连一条链到该数的根......
  • bilibili B站:从零开始学Makefile - 部分截图
    视频摘自B站:https://www.bilibili.com/video/BV1Bv4y1J7QT笔记摘自:https://gitee.com/yanmu_ym/cpp    ......
  • bilibili B站:makefile 编译Linux C/C++项目快速入门
    视频摘自:https://www.bilibili.com/video/BV1vg41177zT    ......
  • Codeforces Round 897 (Div. 2)
    CodeforcesRound897(Div.2)A.green_gold_dog,arrayandpermutation分析:由题意:\[c_i=a_i-b_i\]\(c_i\)种类最多就是\(n\)个数都不同。若\(a_i\)不断变大,\(b_i\)不断变小,那么\(c_i\)会不断变大。代码:#include<bits/stdc++.h>usingnamespacestd;usingll......
  • Codeforces Round 897 (Div. 2) A~E
    CodeforcesRound897(Div.2)A~EA:原先数组里面最小的位置放最大的数,次小的放次大的即可。voidsolve(){ intn;cin>>n; for(inti=1;i<=n;i++){ intx;cin>>x; c[i]={x,i}; } sort(c+1,c+1+n); intnum=n; for(inti=1;i<=n;i++){ ans[c[i].second]=num;num--......