周末小结(1)

周末小结

一、杂谈(牢骚

抽个空把这周的代码总结归纳吧。平时没干过这事。可能一次就坚持不下去了

最近呢主要为蓝桥杯做准备,所以蓝桥杯的题目就写的比较多了

感觉蓝桥杯的题大部分都是暴力的,搜索、模拟比较多,图论也挺多的。总之没很大问题的,最重要的是自信,先把基础打牢是关键。

当然不可能把这周写的题全部贴上来,那太没有意义了,既然这样,就多贴一些有价值的题吧!

其实这周蓝桥杯都刷的少了,主要是在改错题。大概改了二十多道的错题吧,其中百分之六十是水题。

那就写七题吧,每周如此吧,相当于每天一道题。以后就把这篇的格式当做模板来写,会轻松一点点

二、托米的位运算

题目大意:给你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啦!

四、未完待续

猜你喜欢

转载自www.cnblogs.com/37kiazz73/p/10544940.html