在参加了前段时间的xcpc秦皇岛赛,第一次接触acm题型,疯狂被各大高校顶尖精英碾压,最简单的题就是披着算法的外套,纯粹的思维题,
1,数树树
- 一道贼恶心的题,期初想着用L代表1,R代表2,计算和在想办法减去上一层最大值,但是想来想去,不应该,画了个草图,发现,其实就是个二进制。
- L代表0,R代表1,最后加个根节点1罢了。
import os
import sys
# 请在此输入您的代码
n,q = map(int,input().split())
for i in range(q):
s = input()
num = ""
for i in s:
if i=="L":
num = num + "0"
else:
num = num + "1"
print(int(num,2)+1)
2,优美的GCD
链接:ac.nowcoder.com/acm/contest…
来源:牛客网
- 来自牛客的一道2星题,期初想着暴力枚举,在gcd判断,想来想去太复杂了,毕竟是个2星的
- 但是这种答案可能并非暴力处理,由于答案不唯一,索性直接两个质数,结果过了,意外不,惊喜不,傻狗不。
- ×两个质数,是因为保证两个数字的最大公约数,
给出一个整数 n(1≤n≤106)n(1\leq n\leq 10^6)n(1≤n≤106),请求出两个整数 x,yx,yx,y,满足如下条件:
-
x≠yx\neq yx=y
-
1≤x≤109,1≤y≤1091\leq x\leq 10^9,1\leq y\leq 10^91≤x≤109,1≤y≤109
-
gcd(x,y)=n\gcd(x,y)=ngcd(x,y)=n
gcd(x,y)\gcd(x,y)gcd(x,y) 代表 xxx 和 yyy 的最大公约数。
如果有多个可行的答案,请输出任意一个。
输入描述:
第一行包含一个整数 T(1≤T≤105)T(1\leq T\leq 10^5)T(1≤T≤105),表示测试用例的组数。
对于每组测试用例:
仅输入一行,包含一个正整数 n(1≤n≤106)n(1\leq n\leq 10^6)n(1≤n≤106)。
输出描述:
对于每组测试用例:
仅输出一行,包含两个正整数 x,yx,yx,y。如果有多个可行的答案,请输出任意一个。
示例1
输入
复制 2 3 2
2
3
2
输出
复制 9 6 100 102
9 6
100 102
代码详解
#include<stdio.h>
int main(){
int t,n;
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d",&n);
printf("%d %d\n",2*n,3*n);
}
return 0;
}
3,猫猫与数列
这题是真的不难。但是我用的python,根本跑不出代码,主要是系统反馈是答案错误就让我很懵逼,超时也是,一度以为循环没有退出来,导致我一直测试循环,给循环提前break,或者提前终止,结果就很傻逼,我居然怀疑Python解释器有bug了,后来发现是因为Python计算大数,尤其是指数的时候特别慢,一直在计算,导致循环不能退出。换成C++,立马AC。我哭死 猫猫与数列
题目描述
猫猫发现了一个数列 �1=�,�2=�,��=��−2��−1(�≥3)a1=p,a2=q,an=an−2an−1(n≥3).
为了防止数据溢出,猫猫想让你找到最大的正整数 �,��≤�n,an≤M, 其中 �=1018M=1018。可以证明一定有解。
输入描述:
一行,两个正整数 �,�p,q。
2≤�,�≤1092≤p,q≤109.
输出描述:
一行,一个整数,表示答案。
示例1
输入
2 2
输出
5
示例2
输入
999999998 2
输出
3
示例3
输入
10 18
输出
3
AC代码:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
long long p, q;
cin >> p >> q;
int num = 2;
while (pow(p, q) <= 1e18)
{
long long x = pow(p, q);
p = q;
q = x;
num++;
}
cout << num;
return 0;
}
4,操作数组
链接:ac.nowcoder.com/acm/contest…
来源:牛客网
这个就纯思维题,没啥难得
题目描述
给定两个长度为nnn的数组aaa和bbb(((下标从111开始))),你的目标是使a=ba=ba=b,为了完成你的目标,你可以执行以下操作任意次(也可以是000次):
-
选择两个正整数i,ji,ji,j,满足1≤i,j≤n1 \le i,j \le n1≤i,j≤n且i≠ji \not = ji=j,使aia_{i}ai变成ai−1a_{i} -1ai−1,aja_{j}aj变成aj+1a_{j} +1aj+1。
尽管你可以执行任意次操作,但这里求的是最小操作次数。如果无论如何都不能使a=ba = ba=b,请报告。
输入描述:
第一行包含一个正整数nnn (2≤n≤105)(2 \leq n \leq 10^{5})(2≤n≤105),nnn表示数组的长度。
第二行包含nnn个正整数a1,a2,…,ana_1,a_2,\ldots,a_na1,a2,…,an (1≤ai≤109)(1\le a_{i} \le 10^9)(1≤ai≤109)。
第三行包含nnn个正整数b1,b2,…,bnb_1,b_2,\ldots,b_nb1,b2,…,bn (1≤bi≤109)(1\le b_i\le 10^9)(1≤bi≤109)。
输出描述:
输出包含一个整数,表示最小操作次数。如果无论如何都不能使a=ba = ba=b,输出−1-1−1。
示例1
输入
复制 4 1 2 3 4 4 3 2 1
4
1 2 3 4
4 3 2 1
输出
复制 4
4
AC代码
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
sum_a = sum(a)
sum_b = sum(b)
if sum_a != sum_b:
print(-1)
else:
diff = 0
for i in range(n):
if a[i] > b[i]:
diff += a[i] - b[i]
print(diff)