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 ...
最新文章
- OpenCV 中的图像处理 004_平滑图像
- curl上传文件linux,在Linux中如何使用curl从一个服务器流式传输文件到另一个服务器(有限的服务器资源)...
- python 逐行读取csv_在R中如何逐行读取CSV文件并将内容识别为正确的数据类型?...
- js数组的拷贝赋值复制二三事总结
- python使用ide_python使用什么ide?[关闭]
- 20190601:第一个JDBC程序
- 关于反射程序集的心得
- 【算法导论】【排序】—— 计数排序(counting sort)
- watson语音识别下载
- ie浏览器float right 向下错位解决办法
- 斯坦福大学CS143编译原理课程笔记:3.编译器的性价比
- P2799国王的魔镜
- 【渝粤题库】国家开放大学2021春2737市场调查与商情预测题目
- python递归函数基例_函数和代码复用 --Python
- 晨风机器人回复词库_qq机器人词库大全下载
- 01-mnist数字识别
- 产品做出来了,我们该怎么办?
- 【MySQL基础篇】MySQL数据库安装教程
- 直播常见问题原因汇总
- linux配置mysql全局环境变量,Linux 配置 jdk mysql 环境变量
热门文章
- 宝妈适合学计算机方面的什么,适合宝妈的成考专业 学什么专业前景好
- 拉萨-香港-海口-丽江4日游攻略
- 产业经济专题:产业结构高级化、合理化指数、工业化率、机构水平化及产业升级度
- Exp2 后门原理与实践
- uniapp禁止下拉页面
- 虚拟仪器课程设计-音乐喷泉
- 技术爆炸中的蒙日:安培方程
- speedtest命令行linux,Linux通过命令行使用speedtest宽带测速
- 2023基于springboot的健身房管理系统(mysql)-JAVA.VUE(论文+开题报告+运行)
- 120306 php,LAMP搭建之源码篇