ACM北大暑期课培训第一天

  今天是ACM北大暑期课开课的第一天,很幸运能参加这次暑期课,接下来的几天我将会每天写博客来总结我每天所学的内容。好吧下面开始进入正题:

  今天第一节课,郭炜老师给我们讲了二分分治贪心和动态规划。

  1.二分主要讲了两个函数:binary_search 和 lower_bound

    binary_search  在包含size个元素的、从小到大排序的int数组a里查找元素 p,如果找到,则返回元素下标,如果找不到,则返回-1。

    lower_bound    在包含size个元素的、从小到大排序的int数组a里查找比给 定整数p小的,下标最大的元素。找到则返回其下标,找不到则返回-1。

  PS :为了防止 (L+R)过大溢出:  int mid = L+(R-L)/2;

  还讲了二分法求方程的根 

  

///求方程   x*x*x - 5*x*x + 10*x - 80 的一个根a
///已知 f(0) < 0 ; f(100) > 0
///要求|f(a)|<=1e-6
#include <stdio.h>
#include <math.h>
double EPS = 1e-6;
double f(double x)
{
    return x*x*x - 5*x*x + 10*x - 80;
}
int main()
{
    double root, x1 = 0, x2 = 100,y;
    root = x1+(x2-x1)/2;
    y = f(root);
    while( fabs(y) > EPS)
    {
        if( y > 0 ) x2 = root;
        else x1 = root;
        root = x1+(x2 - x1)/2;
        y = f(root);
    }
    printf("该方程的一个根为:%.8f\n",root);
    return 0;
}
二分法求方程的根(举例)

 

例题:POJ 2456 Aggressive cows

PS:最小值最大这类问题 ,先考虑二分是否可行 ,如果可行首选二分

  2.分治   其基本概念为:把一个任务,分成形式和原任务相同,但规模更小的 几个部分任务(通常是两个部分),分别完成,或只 需要选一部完成。然后再处理完成后的这一个或几个 部分的结果,实现整个任务的完成。

  其典型应用为:归并排序和快速排序。

例题:1.输入n个数输出前m大的数

   2.求逆序数

   3.分假币

 

  3.贪心   每一步行动总是按某种指标选取最优的操作来进行, 该指标只看眼前,并不考虑以后可能造成的影响。 贪心算法需要证明其正确性。

例题:1. OpenJ_Bailian 4110 圣诞老人的礼物-Santa Clau’s Gifts

     2.OpenJ_Bailian 4151 电影节

     3.POJ 3190 Stall Reservations

     4.POJ 1328 Radar Installation

 

  4.动态规划       

  动规解题的一般思路:

  1. 将原问题分解为子问题

  2. 确定状态(整个问题的时间复杂度是状态数目乘以计算每个状态所需 时间。)

  3. 确定一些初始状态(边界状态)的值

  4. 确定状态转移方程

 

  能用动规解决的问题的特点

  1) 问题具有最优子结构性质。

  2) 无后效性。(当前的若干个状态值一旦确定,则此后过程 的演变就只和这若干个状态的值有关,和之前是采取哪 种手段或经过哪条路径演变到当前的这若干个状态,没 有关系。)

 

  解题思路:

  1.找子问题

  2. 确定状态

  3. 找出状态转移方程:

 

  动规的三种形式:

  1)记忆递归型

  2) “我为人人”递推型

  3) “人人为我”递推型(用的较多)

 

例题:1.POJ 1163 The Triangle 

     2.OpenJ_Bailian 2757 最长上升子序列

 

posted @ 2018-07-23 21:04  19呀  阅读(671)  评论(3编辑  收藏  举报