声明: 我是新手。对大多数人不具备参考意义,只是acw里打字很爽可以直接看到效果不用git bash…hexo d所以发在这。
非题解,勿扰谢,当然若是有人想指点我,呃. 请指教
可能包含不准确的或者错误…慢慢改进理解吧~~
题目描述
【要多做题】! 暴力也要懂点脑使用特性!
//全新学习的【二进制操作】
#include<bits/stdc++.h>
using namespace std;
int a,k;
int get1()//将最后一位的右边加上一个1
{
return (a<<1)|1;
}
int get2()//判断a的奇偶性,如果是奇数返回1,否则返回0
{
if(a&1) return 1;
return 0;
}
int get3()//将最后一位变为1
{
return (a|1);
}
int get4()//将最后一位变为0
{
return (a|1)^1;
}
int get5()//将从右边数的第一个0变成1
{
return a|(a+1);
}
int get6()//将从右边起的连续的1变成0
{
return a&(a+1);
}
int get7()//将右边起的连续的0变成1
{
return a|(a-1);
}
int get8()//取右边连续的1
{
return (a^(a+1))>>1;
}
//输入k
int get9()//将从右边数第k位变成0
{
return a&~(1<<(k-1));
}
int get10()//将从右边数第k位变成1
{
return a|(1<<(k-1));
}
int get11()//判断从右数第k位是1还是0
{
return (a>>(k-1))&1;
}
int get12()//将从右边数第k位取反
{
return a^(a<<(k-1));
}
int get13()//取末k位序列
{
return a&((1<<k)-1);
}
int get14()//把末k位变成1
{
return a|((1<<k)-1);
}
int get15()//把末k位取反
{
return a^((1<<k)-1);
}
int get16()//去掉序列中最右边的1的左边所有数字
{
return a&-a;
}
作者:Mr.watanuo
链接:https://www.acwing.com/solution/content/132411/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2021-07 过几天报名
正则表达式 和 爬虫的话有空再学 应该研究一个周末差不多初步能用
2021-06
1.
原来二进制可以是这样
走过和没走过 1 和 0 来表示,所以问题可以映射为2进制数(就可以利用计算机电路的特性了)
用过和没用过 1 和 0 etc. etc.
(1 << n) - 1 意思是 10000(n个0)共n+1位(二进制)。 后面-1 就是 - 000000…0001。所以一起就是
111… 111 (n个1)。即按这题定义为所有点都走过。
题目 DP 基础课 最短Hamilton 路径
1 记录
高精度计算公式:
1. 二分法逼近真值。实现精度
对于一个在区间 $(l,r)$ 单调连续(无断点)函数f(mid) = Target
,要求mid的高精度值。可在mid左右两边建立区间,计算f(l)
和f(r)
的值,直到(l,r)足够小,即精度内视作同一点。(三明治定理sandwich thm感觉)
具体要不要smooth function不太记得了///数学蒟蒻
int l = 0, r = 45; //角度theta
while (r - l > eps) //eps = 1e-8
{
mid = (l + r) /2;
if (formula: sin(mid) +... >= target) r = mid
// 注:这是个随着mid(即theta)单调递增的(在0°到90°sin(theta)递增) 所以f(mid) 有以下
// [l,..., mid, ... ,r]
// 如果①mid大了, 就搜左半边,右端点更新为r=mid 旧mid
// 如果②mid小了,就搜右半边,左端点更新为l=mid 旧mid
else l = mid;
}
**2 把数组轮转一位。**
2. bool check(vector<int>& a) {
auto b = a;
sort(b.begin(), b.end());
int n = a.size();
for (int i = 0; i < n; i ++ ) {
if (a == b) return true;
int t = a[0];
for (int j = 1; j < n; j ++ )
a[j - 1] = a[j]; // 把每一位放后一位的数。 直到倒数第二位放最后一位。
a.back() = t; // 然后把最后一位改成之前存的首位t。
}
return false;
}
2) 判断是否一次轮转可以得到。(华为笔试题第一也是它)
def check(self, nums: List[int]) -> bool:
n = len(nums)
flag = (nums[0] >= nums[n-1]) # generator 生成器,先判断是否是需要轮转的,(第一项比最后一项大>= 则True, 也就是需要进入循环,否则返回true)
for i in range(1, n):
if nums[i] < nums[i-1]: #找到降低的点i-1 -> i
if flag:
flag = False
else: #如果只有一个降低的点,其他都递增,那么可以轮转。
return False #若是有多个降低的点,那么一次轮转就得不到 False
return True
或用[i:] 和[:i]来拼接
num = sorted(nums)
for i in range(len(nums)):
if nums[i:] + nums[:i] == num:
return True #for循环特性,所有都是true才是True
return False
reverse 搭配str.begin()
比如翻转[0, n - k - 1]
reverse(str.begin(), str.begin() + str.size() - k)
翻转[n-k-1, n - 1]
reverse(str.begin() + str.size() - k, str.end());
3. 把链表读出来一顿操作
v = []
while head:
v.append(head.val)
head = head.next
n += 1
2) 还可以把数组输出回链表形式
head = ListNode(v[0])
result = head //头节点 前两行应该可以合并result = ListNode(v[0])
for i in range(1, len(v)):
head.next = ListNode(v[i]) //当前结点赋为v[i]
head = head.next //把指针head移动到下一个节点.
return result
4. Python 复制链表 (c ++ 直接 auto a = b就行)
①这其实就是 new = old[:]。切片运算符[:]返回一个序列的切片。切片过程是切下列表的一部分,创建新的列表,将切下的部分复制到新列表。
② a = list(b)
③ a = [] 加上 a.extend(b)
如果要函数式编程就
def clone(nums):
copy = []
copy.extend(nums)
return copy
if (a[j] >> i & 1) 如果第i位是1的话:
由于KickStart评测界面过于慢(点三四下才能出结果,退出修改code还得点一下。。就不能少点鼠标移动么 mac哭了),先在这做。要过大TestCase再提交上去。
面试笔试题刷起来~~
5. ``` c - '0' ``` 作用是**减去0的ASCII码大小48。这样字符串数字{[0,n]}的ASCII就对应了 0, 1, ..., n
用处:
string number = to_string(15);
string nums[] = {"zero", "one", ... , "nine"};
cout << nums[number - '0'] << ...
2. 图论问题就用图的模板来做。
做不了就暴力 dfs! 或者根据题意bfs
参照之前总结的。
最短路就分情况三种
①单源
简单正边权:Dijkstra
一般形式存在负边:SPFA / BellmanFord(我没拼错哈哈cht)
②多源Floyds
最小生成树(连通图减边为数) — Kruskal
Prim 算法
二分图
1. 染色法
2. 匈牙利算法
(具体适用范围要重新复习一下基础课或相关大佬的题解)
DP 大部分都可以塌缩为背包,主要是状态表示(如何定义题意要求的目标值)和如何用迭代来做(i,j,等等遍历整个集合||||转移),把规则覆盖到定义的状态集合里,让它满足涵盖题意所要求的情况的集合。i.e.:{题意}∈{f[i][j][等等]}
注:找不着数学集合 ‘包含’的符号所以用元素属于∈代替了
简单题1,2题做法:
基础算法思维,还有可以尝试下库函数 API Boy, cpp特性。(或者py)
数学推理题:
这个…
猜!猜性质!
暴力猜,想不出就枚举所有看起来对的性质,验证一下,合理就根据这个写,ac能过就行。骗也要骗过去。!
进阶的我还完全不会 摊手,感觉提高课还需要几个月才能刷完. 感觉那之后才是熟悉模板使用了 Stage Proficient 基础课一类题的量不太够,变型一下就不知道咋调了..(懒了思路没背全, 考前要改啊!) 要多记录同类题 观察规律呀!!