周末小结
一、杂谈(牢骚)
抽个空把这周的代码总结归纳吧。平时没干过这事。可能一次就坚持不下去了 。
最近呢主要为蓝桥杯做准备,所以蓝桥杯的题目就写的比较多了
感觉蓝桥杯的题大部分都是暴力的,搜索、模拟比较多,图论也挺多的。总之没很大问题的,最重要的是自信,先把基础打牢是关键。
当然不可能把这周写的题全部贴上来,那太没有意义了,既然这样,就多贴一些有价值的题吧!
其实这周蓝桥杯都刷的少了,主要是在改错题。大概改了二十多道的错题吧,其中百分之六十是水题。
那就写七题吧,每周如此吧,相当于每天一道题。以后就把这篇的格式当做模板来写,会轻松一点点
二、托米的位运算
题目大意:给你n个数,从中选k个数使得这k个数互相 & 运算后为2的v次方,且找到一个最大的v
n为1e5 k个数为 1-2^31
for(int i=30;i>=1;i--) {
int s = (1LL << 31) - 1;
cnt = 0;
for(int j=1,j<=n,j++) {
if(a[j] & (1 << i)) {
s &= a[j];
b[++cnt] = a[j];
}
}
if((s & -s) >= (1 << i)) {
break;
}
}
我刚看到这题都是懵的,但是后来,发现只要根据二进制,遍历两遍,用集合的思想,用s=11111111&a[i-n] 当一轮与运算后,s=1000000(二进制) 那么久找到了!复杂度O(3e5)
三、桃花
题目大意:一个无向图,找到图的最大的直径,要点:无向图、邻接表、直径,方法:先随便从一点出发,找到的最远的那个点就是直径的起点,再从起点出发,找到最大距离。
首先是邻接表,要少用vector的那种,一般卡一下就没得了。
struct Edge
{
int to,next;//下一个顶点,下一条边;
} edge[maxn*2];
int head[maxn];//表头;
int num=1,s;//内存指针;
void add(int b,int e)
{
edge[num].to=e;
edge[num].next=head[b];
head[b]=num++;
}
遍历
void dfs(int now,int pre,int len){
if(len>ans){
ans=len;
s=now;
}
for(int i=head[now];i;i=edge[i].next){
int j=edge[i].to;
if(j==pre){
continue;
}
dfs(j,now,len+1);
}
}
多嘴一句,今天又写了一道,求从起点遍历到每一个点的最小距离,思路就是想找出离起点最远的距离,然后把所有边的距离和的两倍减去这个最长距离就OK啦!