清北学堂(2019 4 28 ) part 1

今天主要用来铺路,打基础

枚举

没什么具体算法讲究,但要考虑更优的暴力枚举方法,例如回文质数,有以下几种思路:

1.挨个枚举自然数,再一起判断是否是回文数和质数,然而一看就不是最优

2.先枚举质数再判断回文,但质数显然要比回文数要多,较下一种慢

3.先枚举回文数再判质:

  (1).分别开数组,把每个元素当做一位数,如w[1]表示个位,w[2]表示十位等,如果能构成回文,再判质

  (2).枚举最大数位数的一半,即分析1-600000之中的数只需枚举后三位,将后三位翻转形成回文数,再判质,显然更优

洛谷原题,用的3-(1),其实效果与1相仿,就是少判断几次,很快ac了,显然数据很水

搜索

这个真的没有整的必要,毕竟最近学了,最近也整理过了(只会打模板QAQ)

贪心

贪心是一类思路的总称,其实没有像动态规划,深搜广搜,dijkstra一样的公式,只是指这类题可以根据局部最优,推出全局最优

大佬曰:“贪心难的不是算法思路,而是如何证明这个算法思路是对的”

(就像几何证明题,你看它垂直,就是证不出来)

贪心主要思路:

1.列些好像是对的的关系式,越多越好,当然如果直接有正确思路可以直接敲代码了。。。

2.对于以上思路、关系式,尽力举反例,卡掉越多思路剩下的正确率越高,除非你把自己的思路全部卡掉,对于这种情况,提供两种方案:

  (1).放弃此题

  (2).取样例过得多的算法,骗更多的分

其实贪心需要刷题来养成形成最优方案的思维

二分

讲过,但具体并没进行过代码实现过,今天简单练了下

粘个代码:

#include<bits/stdc++.h>
using namespace std;
int n;         //数据总个数
int target;    //查询目标
int l,r,mid;
int a[50005];
priority_queue<int,vector<int>,greater<int> > q; //用优先队列排序,不用sort
int main(){
    scanf("%d%d",&n,&target);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        q.push(x);
    }
    for(int i=1;i<=n;i++){
        a[i]=q.top();
        q.pop();
    }
    for(int i=1;i<=n;i++)printf("%d ",a[i]);
    puts(""); //好像puts比printf和cout快的多,就像getchar与scanf与cin
    l=1;
    r=n;
    while(l<=r){  //二分主体
        mid=(l+r)>>1;
        if(a[mid]==target){
            printf("%d\n",mid);
            return 0;
        }
        if(a[mid]>target)
            r=mid-1;  //必须作加减处理,不然卡死循环
        else if(a[mid]<target)
            l=mid+1;
    }
    printf("Why did u say that number?\n"); //蝙蝠侠老梗(无解情况)
    return 0;
}

分治

好像就是递归??

用分治做出来过“幂次方”(题目传送门)

(博客传送门)

当时觉得自己a了道递归题好厉害。。。完全不知道这是分治

原文地址:https://www.cnblogs.com/648-233/p/10786208.html

时间: 2024-10-11 04:59:18

清北学堂(2019 4 28 ) part 1的相关文章

清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的是这里纸张太小,小A无法把故事详细地说给大家听.可能小A自己也讲不清楚自己的故事,因为如果讲清了,也就没有这道题目了-- 小A的问题是这个样子,它找到了n份不同的工作,第i份工作每个月有ai的工资,每份工作需要小A每天

铁轨 清北学堂 线段树

铁轨 清北学堂 线段树 [题目描述] R 国的铁轨经常会进行重新修建. R 国是一个细长的国家,一共有 n 个城市排成一排,首都位于 1 号城市,相邻两个城市之间有铁路相连. 每次新建铁轨的时候,一定是从首都开始修建,直到某一个城市为止,这其间的铁路都会变成新版本的设 施,而旧设施会被拆除.然而,由于 R 国的工程师脑子不太好使,任意两种不同版本的铁路之间都无法连 接,因此必须要进行换乘. 现在给出你修建铁轨的操作,小 R 时不时第会想问你,如果在第 x 个城市到第 y 个城市之间随机选择一个

&lt;知识整理&gt;2019清北学堂提高储备D5

今天主讲图论. 前言:图的定义:图G是一个有序二元组(V,E),其中V称为顶集(Vertices Set),E称为边集(Edges set),E与V不相交.它们亦可写成V(G)和E(G). 一.图的存储: 1.邻接矩阵: 2.邻接表: 数组模拟链表实现:记录每条边的终点.边权(如果有的话).同一起点的上一条边的编号,并记录以每个点为起点的最后一条边的编号. STL中的vector:记录以每个点为起点的边. 一些vector的细节: vector 本质就是 c++ 模板库帮我们实现好的可以变长的数

清北学堂(2019 4 30 ) part 3

今天总的讲些算法,会了的话...看上去好厉害的样子: 1.老朋友动态规划DP: DP重点: 1.边界条件,开头不需处理的数据,比如斐波那契数列中的第一二项 2.转移方程,后面的项需要根据前面几项求出自身值的方程(等式) 套路: 1.定状态, 2.写方程, 3.敲代码 三种用法: 1.顺着推, 2.倒着推, 3.记忆化搜索, 举个栗子——斐波那契: 1.倒着推:比较简单,只写方程:f[n]=f[n-1]+f[n-2] 2.顺着推:代码 #include<bits/stdc++.h> using

清北学堂(2019 5 3) part 6

今天讲STL 1.pair--<algorithm> 声明形如pair<int,int> x;(不是int也可以),表示x有前后两个成员,都是int类型,调用时写x.first(second); 对pair声明的变量可以不自定义cmp函数,先按照pair中第一个元素优先排序,再按第二个,即第一个元素相同时对第二个元素排序, 同时pair支持这种操作:pair<pair<int,int>,int>; 2.vector--<queue>/<ve

清北学堂 最大速度

最大速度 (maxv.pas/c/cpp) [问题描述] Ron的老爸的Flying Car出了些问题,现在必须要在地上跑到很大的速度才能飞起来,但是Flying Car飞起来的那一刻不能被麻瓜看到.为了确保安全飞起来,需要知道车到可以飞起来的地方时所能达到的最大速度.他的Flying Car一开始拥有一个初速度,移动一次增加速度1:因为车道很窄,宽度只有1,所以仅当要转向的方向有路时才能转,左转一次减少速度35,右转一次减少速度40,当前进.左转.右转都无路可走的时候,调头(连左转两次或连右转

5月3日济南清北学堂随堂测试题目

消失的数字(number) Time Limit:1000ms   Memory Limit:128MB 题目描述 rsy拥有n个数,这n个数分别是a1,a2,-,an. 后来出现了一个熊孩子zhw,用橡皮擦去了其中若干个数字,并且打乱了剩下的数字.rsy赶到现场后只剩下了m个数字b1,b2,-,bm,她想知道哪些数字被擦去了. 现在你需要告诉rsy被擦去的n-m个数是什么. 输入格式(number.in) 第一行一个数n,第二行n个数ai,表示一开始的数字. 第三行一个数m,第四行m个数bi,

清北学堂学习总结 day1 数据结构 练习

1.二叉搜索树 STL set直接做就可以了 2.树状数组+差分数列: codevs 1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所有数都增加X 2:询问第i个数是什么? 输入描述 Input Description 第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数.如果第一个数是1,后接3个正

2017清北学堂集训笔记——图论

我们进入一个新的模块——图论! emmmmm这个专题更出来可能有点慢别介意,原因是要划的图和要给代码加的注释比较多,更重要的就是...这几个晚上我在追剧!!我们的少年时代超级超级超级好看,剧情很燃啊!!咳咳,好吧下面回归正题. 一.图的存储: 1.邻接矩阵: 假设有n个节点,建立一个n×n的矩阵,第i号节点能到达第j号节点就将[i][j]标记为1(有权值标记为权值), 样例如下图: 1 /*无向图,无权值*/ 2 int a[MAXN][MAXN];//邻接矩阵 3 int x,y;//两座城市