ACM算法之基础算法
ACM算法基础篇
基础算法有:枚举,递推,贪心,,分治,递归,构造,模拟,排序和检索
1、枚举:也叫穷举,是从问题所有可能解中一一枚举个元素,用题目给的检验条件判定哪些是无用的,那些是有用的,符合的解即为答案。优点是算法简单,缺点是当问题的规模变大时,效率低。枚举很慢!!!我只是举例这个复杂的代码哈,其他优化方法有很多的,可以参考其他博客大佬呀
例题:百钱买百鸡100块钱,公鸡3元一只,母鸡5元一只,小鸡1元一只,问:各买多少合适?
#include <stdio.h>
#include <stdlib.h>int main()
{int x,y,z;for(x=0;x<=100;x++){for(y=0;y=100;y++){for(z=0;z=100;z++){if(x+y+z==100&&3*x+5*y+z/3==100&&z%3==0)printf("%d%d%d\n",x,y,z);}}}
}
2、递推;递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法(有顺推和逆推两种)。
顺推:斐波那契数列*F(n)=F(n-1)+(n-2)
逆推:例如————-银行存款,年利息是0.03,若要在n年后连本带利取出m元,至少要存多少?
3、贪心算法在对问题求解时,总是做出在当前看来是最好的选择,不从整体最优考虑,从局部考虑最优解.注意(不是所有都适合,要分析题目)某个状态不影响当前状态
例如:*合并果子有n堆果子,第一堆有ai个,现在要合并成一堆,每次合并的代价是两堆果子的总果子数,求合并的所有果子的最小代价
每次选取最少的两堆合并,直到剩一堆即可
证明:首先假设合并之后只是把两堆搬到一起,不合并,
那么,合并x,y,堆所消耗的体力就是组成x的堆的果子数+组成y的果子数
这样,假设某一堆t,被某一堆合并,有被某一堆合并并。。。重复m次,
那么简单考虑这个t堆,它所消耗的体力将会是m*果子数(t),
**m(1)*果子数(1)+m(2)果子数(2)+。。。+m(n)果子数m(n) 而果子数是一定的,(因为合并次数一定),所以我们只需要使果子数大的那一堆的m尽量小,使果子数小的那一堆的m尽量大, 每次选取最少的两堆合并,直到剩一堆即可
sort(a,a+n);//先排序int ans=0;for(int i=1;i<n;++i){a[i]+=a[i-1];//合并ans+=a[i];int tmp=a[i];for(int j=i+1;j<n&&a[j]<a[i];++j){a[j-1]=a[j];a[j]=tmp;}}printf("%d\n",ans);
4、递归直接或间接调用自身函数或者方法的算法。(不太好理解,没关系,慢慢来~)递归对资源消耗很大,尽量避免!!
例如:
int F(int n){if(n<=1){return 1;}//递归结束条件return F(n-1)+F(n-2)//调用自身}
5、分治就是把一个复杂的问题分成两个或更多相同或相似的子问题,再把子问题分解成更小的问题(递归)…直到最后子问题可以简单地直接得求解,解这些子问题,然后将各子问题合并得到元问题的解。三步:分解–解决–合并
例题:在n个元素中找出最大元素和最小元素
void maxAndim(int A[],int i,int j,int &max,int &min)//传入一个数组
{if(j==i){max=min=A[i];return;}if(j-1==i){max=A[i]>A[j]?A[i]:A[j];min=A[i]>A[j]?A[i]:A[j];return;}//递归结束条件,最小子问题的解int mid,max1,max2,min1,min2;mid=(i+j)/2;maxAndim(A,i,mid,max1,min1);maxAndim(A,mid+1,max2,min2);//问题分解max=max1>max2?max1:max2;min=ax1>max2?max1:max2;//解的合并
}
6、构造(复杂的不太会哈~举个简单的例子吧)
例题:输出n个以空格分隔的“AC”。
for(int i=1;i<n;++i){printf("AC");}printf("AC\n");
7、模拟最直观的算法,通常是对某一类事件进行描述,通过事件发生的先后顺序进行输入输出。(很适合我们程序设计的初学者呐~)
例如:一元n次多项式f(x)=aXn+…!=0;
1、多项式中自变量为x,从左往右按照次数递减顺序给出多项式
2、多项式中只包含系数不为0的项
。。。。。。。。(好多啊,不举了吧)
for(int i=n;i>=0;i--){scanf("%d",&a);if(i!=n&&a>0){printf("+");//根据正负,是否为最高此项决定加号}if(abs(a)>1||i==0){printf("%d",a);输出系数}if(a==-1&&i){printf("-");//-1系数特判,常数项已特判}if(i>1)//二次项及以上输出{printf("x%d",i);}if(i==1)//一次项{printf("x");}}
8、排序很多了,排序法非常多,冒泡排序,快速排序,选择排序,插入排序(sort ),堆排序…等
sort(a,a+n);//对数组a从小到大排序,使用<进行比较sort(b,b+n,cmp);//对数组b按照函数cmp指定的规则排序,使用cmp函数比较sort(c.begin(),c.end());//用迭代器控制排序范围,多用于STL中的数据结构
struct Node{int x,y;};bool cmp(const Node &a,(const Node &b)//结构体中排序{return a.y>b.y;}
9、检索有顺序查找,二分查找,插值查找,动态查找等
例子
int binary_search(int a[],int n.int key)
{int m,l=0,r=n-1;while(l<r){m=l+((r-1)>>1);//元素相同时求下标最小//m=l+((r+l-1)>>1);元素相同时求下标最大if(a[m]<key){l=m+1;}else{r=m;}}if(a[r]==key){return r;}return -1;
}
ACM算法之基础算法相关推荐
- java基础之算法_java基础算法
package com.sxwl; import org.springframework.boot.SpringApplication; import org.springframework.boot ...
- 算法基础课-基础算法
第一讲 基础算法 快速排序 归并排序 二分 整数二分模板 AcWing 789. 数的范围(整数二分法) AcWing 1236.递增三元组 AcWing 730. 机器人跳跃问题 AcWing 12 ...
- BPR贝叶斯个性化推荐算法—推荐系统基础算法(含python代码实现以及详细例子讲解)
BPR贝叶斯个性化排序算法 一.问题导入 二.显示反馈与隐式反馈 2.1 显式反馈与隐式反馈基本概念 2.2 显式反馈与隐式反馈的比较 2.3 显式反馈与隐式反馈的评价方法 2.3.1 显式反馈数据模 ...
- python实现快速排序算法_基础算法:快速排序(python实现)
算法原理 快速排序是一个具有较高性能的排序算法,其主要思想如下: 对数组中的某个元素,确定其在数组中的排序位置,即在其之前的所有元素均小于该元素,在其之后的均大于该元素.对小元素组和大元素组同样执行该 ...
- -9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)...
题目内容 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量. 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆 ...
- 实现链栈的各种基本运算的算法_LeetCode基础算法题第78篇:如何不用加减号实现两数的加法运算?...
一直很纠结算法的文章应该怎么写.最后觉得还是从最简单的level开始写吧,一开始就弄些重量级的,什么人工智能,机器学习的算法,还要有大量的数学以及优化的知识,小白们估计会很郁闷,当然我也不一定能做出来 ...
- java程序员基础算法_java基础算法
冒泡排序 图解 编码实现 public class Sort { public static void main(String[] args) { //通过冒泡排序给当前的数字进行排序(升序) int ...
- 「ACM-ICPC基础算法」
系列文章目录 本系列文章是关于<ACM-ICPC算法竞赛基础算法>的文章! 零.题目介绍 有排成一行的n个方格( 0 < n <= 50),用红.粉.绿三种颜色涂每个格子, 每 ...
- 暑期集训2:ACM基础算法 练习题G:POJ - 1298
2018学校暑期集训第二天--ACM基础算法 练习题G -- POJ - 1298 The Hardest Problem Ever Julius Caesar lived in a time o ...
最新文章
- 自考总结-2019-4-14
- idea 启动php项目路径,关于idea中Java Web项目的访问路径问题
- 在 Mac上压缩的压缩包 在windows上都会产生.DS_Store这种垃圾文件 怎么办
- 机器学习实验中的编程技术(part4)--模型持久化
- 未签名程序使用java_java applets(未签名)可以创建/读取cookie吗?
- Gerrit代码Review入门实战 1
- 05-windows下R安装包的几种方式
- php面试题9(看的时候就应该随手截图做笔记的)
- zabbix错误提示解决
- 2022短视频去水印小程序带流量主/CPS/资源/工具/批量解析/修改MD5
- Boblog热门日志、随机日志、热门Tags插件源代码
- 基于树莓派的语音邮件收发
- 冰冻三尺,非一日之寒。数据解析——xpath(2)
- 基于51单片机的扫地小车,扫地机器人设计。 有原理图,程序代码,原文
- 车主必看,2021年车险改革内容,2022年车险改革
- datax(10): 源码解读Communication(Datax通讯类)
- Oracle项目管理主数据之WBS
- Violent Flows violence recognition 数据集地址下载
- 考研英语阅读理解做题技巧(6):细节题
- Linux磁盘管理 df、du、fdisk