首页 > 其他分享 >洛谷 P8918 『MdOI R5』Jump 题解

洛谷 P8918 『MdOI R5』Jump 题解

时间:2023-04-02 10:12:41浏览次数:41  
标签:__ R5 洛谷 int 题解 mid tot star2 main

题目传送门

这一题其实很简单,只是要想到正确方法

我一开始用了奇怪的搜索

①无解的情况:

看上去很离奇,实际上略加思索就会发现,如果输入 \(n\) 为偶数,那么就铁定无解。证明过程如下:

令 \(n\bmod{2}=0\),人距离 \(n\) 点的距离为 \(dis\) ,则当走出第一步(步长为 \(1\))时,有:

\[dis=\mid n\pm1\mid \]

所以:

\[dis\bmod{i} = 1 \]

设 \(k\) 为正整数且满足 $k > 1 $ ,显然有:

\[2^k \bmod{2}=0 \]

因此,在走出第一步后无论怎么走也到达不了奇数的距离,即无法走到 \(n\) 点。

②有解的情况

似乎是一道走路问题,实际上我们可以把向左走看成减法,把向右走看成加法,那么题目就转化成了:

有一个正整数 \(n\),试回答 \(n\) 是否满足如下式子:

\[n=\star2^0\star2^1\star......\star2^k \]

如果不满足,则输出 \(-1\),否则输出 \(k\) \((k\in N_+)\),其中"\(\star\)"处可以填正号或负号使式子成立

那么我们观察数据,手算几个,就可以发现:

\[1=2^0 \]

\[3=2^0+2^1 \]

\[5=-2^0+2^1+2^2 \]

\[...... \]

规律很难找,但是我们发现不管怎么样,都有 $n\le\mid\star20\mid+\mid\star21\mid+......+\mid\star2^k\mid \(, ("\)\star\("意义如上所述),这其实很好解释,因为如果不满足这个关系式,那么就算"\)\star$"处全部使用正号,也无法达到 \(n\) 的值。
所以我们便可以利用这个特性,让一个变量 \(tot\) 每次累加 \(2^i\) ,直到 \(tot\ge n\),此时累加的次数就是答案。

CODE(这里提供三份代码):

def main():
	T = int(input())
	for k in range(T + 1):
		n = int(input())
		if not (n & 1):
			print(-1)
			continue
		tot = 0
		for i in range(0, 114514):
			tot += (1 << i)
			if tot >= n:
				print(i + 1)
#注意这里由于i从0开始,所以输出i+1
				break

if __name__ == '__main__':
	main()
#include <stdio.h>

int main() {
	int T, n, tot = 0;
	scanf("%d", &T);
	while(T --) {
		scanf("%d", &n);
		if(! (n & 1)) {
			printf("-1\n");
			continue;
		}
		for(int i = 0; ; i += 1) {
			tot += (1 << i);
			if(tot >= n) {
				printf("%d\n", i + 1);
				break;
			}
		}
		tot = 0;
	}
	return 0;
}
#include <bits/stdc++.h>

#define endl '\n'
  
using namespace std;

int T, n;
int tot = 0;

signed main() {
	
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> T;
	
	while(T --) {
		cin >> n;
		if(! (n & 1)) {
			cout << -1 << endl;
			continue;
		}
		for(int i = 0; ; i ++) {
			tot += (1 << i);
			if(tot >= n) {
				cout << i + 1 << endl;
				break;
			}
		}
		tot = 0;
	}
	return 0;
}

标签:__,R5,洛谷,int,题解,mid,tot,star2,main
From: https://www.cnblogs.com/ZyIOLO/p/17279970.html

相关文章

  • 洛谷 P8742 [蓝桥杯 2021 省 AB] 砝码称重
    经典01背包题首先介绍一下01背包,即一种DP问题,以放置物品为模型,每个物品只能放一次。其区分于完全背包(每个物品可以放无限多次),以及多重背包(每个物品有一个固定次数上限)。题中给出了$N$个砝码及每个砝码的质量,要求我们求出可以称出质量的种数。由此想到转化为01背包。......
  • 洛谷 P9009 [入门赛 #9] 牵连的世界 (Hard Version) 题解
    P9009[入门赛#9],真9。这是一道hack题,即你需要自造符合题意的数据使题中所给程序无法AC。Task01看数据范围知一切,显然有\(-2\times10^9\lea_i\le2\times10^9\),因此\(a_i\)可能为负数。注意C/C++中的取模%(mod)运算实质上是为取余运算(rem)对于整型数a,b来说......
  • 洛谷 P8762 [蓝桥杯 2021 国 ABC] 123 题解
    为什么可以使用前缀和,这里提供解释:初读题目,我们发现这个数列很迷惑,似乎不能使用数学方法来解。\[1,1,2,1,2,3,1,2,3,4,\cdots\]但是,我们可以想到数形结合的方式,我们将数列看作一个三角形,于是他变成了:\[1\]\[1,2\]\[1,2,3\]\[1,2,3,4\]\[\cdots\cdots\]于是本题变得好思......
  • 洛谷P1217 [USACO1.5]回文质数 Prime Palindromes
    #include<bits/stdc++.h>usingnamespacestd;inta,b;boolzs(intx){if(x%2>0){for(inti=3;i<x;i+=2)if(x%i==0)returnfalse;returntrue;}elsereturnfalse;}boolhws(intx......
  • SP181 SCUBADIV - Scuba diver 题解
    题目传送门题目大意潜水员有\(n\)个气缸,每个气缸能够提供容量为\(o_i\)的氧气和容量为\(d_i\)的氮气,每个气缸的重量为\(w_i\)。给出潜水员所需要的氧气量和氮气量,求所需气缸的总重的最低限度是多少。解题思路对于每个气缸,有两种不同的费用:氧气和氮气,需要满足这两个条......
  • 一篇关于异或操作的题解 (来源:杭电oj: find your present (2))
    害惭愧惭愧老长时间没写代码了——————————转回正题,对于杭电这个题先说我超时的错误想法—————————————————————————————————————————————————————————————— 一开始我的想法是开一个大小为100000......
  • [省选联考 2023]D1 题解
    D1T1P9166火车站观察题目,联系到以前做过的一些区间dp可以发现如果小A可以去到(这里是去到而不是最终停在)\(k\)地点,那么\(x\)到\(k\)之间的所有地点他都可以去到,因为火车是连续的,不能跳着走,要来到当前地点必须到过路途中的所有节点。这样子就好办了,分两次处理往左边和......
  • P6146 [USACO20FEB]Help Yourself G 题解
    题目链接先按左端点从小到大排序。设\(f(i)\)表示前\(i\)条线段的所有子集的复杂度之和。考虑从\(f(i-1)\)转移到\(f(i)\),即考虑新加进来第\(i\)条线段的过程。第\(i\)条线段加进来所新产生的贡献分两种:设除了第\(i\)条线段选中的线段集合为\(S\),则若\(S\)......
  • # P4391 [BOI2009]Radio Transmission 无线传输 题解
    [BOI2009]RadioTransmission无线传输题目描述给你一个字符串\(s_1\),它是由某个字符串\(s_2\)不断自我连接形成的(保证至少重复\(2\)次)。但是字符串\(s_2\)是不确定的,现在只想知道它的最短长度是多少。输入格式第一行一个整数\(L\),表示给出字符串的长度。第二行给出......
  • 笔记:洛谷 P3985 不开心的金明
    算法笔记:[背包问题]洛谷P3985不开心的金明题目详情原题链接:洛谷P3985不开心的金明不开心的金明Description  金明今天很不开心,家里购置的二手房就要领钥匙了,房里并没有一间他自己专用的很宽敞的房间。更让他不高兴的是,妈妈昨天对他说:“你需要购买哪些物品,怎么布置,你......