ACM学习<二>

 

穷举算法思想:

    一句话:就是从所有可能的情况,搜索出正确的答案。
步骤:
    1.对于一种可能的情况,计算其结果。
    2.判断结果是否满足,YES计算下一个,no继续步骤1,然后判断下个可能的情况。
实例:
    孙子算经--鸡兔同笼:头35,脚94,几鸡几兔?
    
    
#include <iostream>                                                       //头文件
using namespace std;
int qiongju(int head, int foot , int *chicken,int *rabbit) //穷举算法
{
int re,i,j;
re=0;
for(i=0;i<=head;i++) //循环
{
j=head-i;
if(i*2+j*4==foot) //判断,找到答案
{
re=1;
*chicken=i;
*rabbit=j;
}
}
return re;
}
int main() //主函数
{
int chicken,rabbit,head,foot;
int re;
cout<<"鸡兔同笼问题:"<<endl;
cout<<"输入头数:";
cin >>head;
cout<<"输入脚数:";
cin >>foot;
re =qiongju(head,foot,&chicken,&rabbit); //& 跟 qiongju()里面的 * 是不是表示 引用??
if(re==1)
{
cout<<"鸡有:"<<chicken<<"只, 兔有"<<rabbit<<"只。" <<endl;
}else
{
cout<<"无法求解!"<<endl;
}
}
 
递推思想:
     1.根据已知的结果和关系,求解中间的结果。
     2.判断是否达到要求,如果没有达到,则继续根据已知的结果和关系求解中间结果。如果有的话,则表示寻找到一个正确的结果。
 实例:斐波那契数列———兔子产子
#include <iostream>
using namespace std;
int fibonacci(int n)
{
if(n==1 || n==2)
{
return 1;
}
else
{
return fibonacci(n-1)+fibonacci(n-2);//递归调用
}
}
int main()
{
int n,num;
cout<<"斐波那契数列——兔子产子:"<<endl;
cout<<"请输入时间:";
cin >> n;
num=fibonacci(n);
cout<<"经过"<<n<<"年,可以产子"<<num<<"对"<<endl;
}
 
递归思想:
     递归算法,就是在程序中不断反复调用他自身的函数调用方式,这种函数也称为递归函数。
                     函数的递归调用用分两种情况:直接递归和间接递归。
                     直接递归:即在函数中调用函数本身。
                     间接递归:即间接地调用一个函数,如func_a调用了func_b,func_b又调用了func_a;间接递归用的不多。
     优点:代码间接清晰,可读性更好。用递归比循环表死简洁精炼。特别人工智能,八皇后问题,汉诺塔等适合用递归
     缺点:没有明显的减少代码规模和节省内存空间。 递归比非递归运行速度要慢一些。附加函数增加了时间的开销(要执行一系列的压栈出栈)。二者递归层次太深还可能导致堆栈溢出。
     实例:经典的阶乘
#include <iostream>
using namespace std;
long fact(int n); //函数的声明
int main()
{
int i;
cout<<"请输入要求阶乘的一个整数:";
cin >>i;
cout<<i<<"的阶乘结果为"<<fact(i)<<endl;
}
long fact(int n)
{
if(n<=1)
return 1;
else
return n*fact(n-1);
}
 
分治算法思想:
     基本思路:将一个计算复杂的问题分为规模较小,计算简单的小问题求解,然后综合各个小问题,得到最终问题的答案。
     基本过程:
     1.对于一个规模为N的问题若该问题可以容易的解决,那就直接解决。否则执行下面的步骤。
     2.将该问题分解为M个规模较小的子问题,这些子问题五项多里,并且与原问题形式相同。
     3.递归的解子问题。
     4.然后,将各子问题的解合并得到原问题的解。
例子:
    问题:一个袋子30个硬币,一个假的,假的较轻。如何分辨假币?
    步骤:
          1.首先为每个币编号,分成两份,放在天平上。
          2.因为假币在轻的一方,继续将轻的重复上面的做法。
          3.直到剩下2个,直接用天平找出。
   
#include <iostream>
using namespace std;
#define MAXNUM 4
int FalseCoin(int coin[],int low,int high)
{
int i,sum1,sum2,sum3;
int re;
sum1=sum2=sum3=0;
if(low+1==high)//最后一堆是两个的时候
{
if(coin[low]<coin[high])
{
re=low+1;
return re;
}
else
{
re=high+1;
return re;
}
}
if((high-low+1)%2==0)//n为偶数
{
for(i=low;i<=low+(high-low)/2;i++)
{
sum1+=coin[i];//前半段和
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum2+=coin[i];//后半段和
}
if(sum1>sum2)
{
re=FalseCoin(coin,low+(high-low)/2+1,high);
return re;
}
else if(sum1<sum2)
{
re=FalseCoin(coin,low,low+(high-low)/2);
return re;
}
else
{ }
}
else //n为奇数
{
for(i=low;i<=low+(high-low)/2-1;i++)
{
sum1+=coin[i];//前半段和
}
for(i=low+(high-low)/2+1;i<=high;i++)
{
sum2+=coin[i];//后半段和
}
sum3=coin[low+(high-low)/2];
if(sum1>sum2)
{
re=FalseCoin(coin,low+(high-low)/2+1,high);
return re;
}
else if(sum1<sum2)
{
re=FalseCoin(coin,low,low+(high-low)/2-1);
return re;
}
else
{ }
if(sum1+sum3==sum2+sum3)
{
re=low+(high-low)/2+1;
return re;
}
}
}
int main()
{
int coin[MAXNUM];
int i,n;
int place;
cout<<"分治法求假币问题!"<<endl;
cout<<"请输入币的个数:";
cin >>n;
cout<<"请输入币真假的重量:";
for(i=0;i<n;i++)
{
cin >> coin[i];
//scanf("%d",&coin[i]);
}
place =FalseCoin(coin,0,n-1);
cout<<"位子实在上述的第"<<place<<"个是假的"<<endl;
}
 
概率算法思想:
     1.将问题转化为相应的几何图形S,S的面积是容易计算的。问题往往是对应的集合图形的S1的面积,
     2.然后向几何随机撒点。
     3.统计S S1的点数,根据关系得出结果。
     4.判断是否达到精度,否执行2步骤,是 结束
          4种形式:数值概率算法,蒙特卡罗算法 ,拉斯维加斯算法,舍伍德算法。
    蒙特卡罗概率算法 计算PI:
#include <iostream>
#include <time.h>
using namespace std;
double MontePI(int n)
{
double PI;
double x,y;
int i , sum;
sum = 0;
srand(time(NULL));
for(i=1;i<n;i++)
{
x=(double)rand()/RAND_MAX;
y=(double)rand()/RAND_MAX;
if(x*x+y*y<=1)
sum++;
}
PI=4.0*sum/n;
return PI;
}
int main()
{
int n;
double PI;
cout<<"蒙特卡罗概率算法 计算PI"<<endl;
cout<<"输入撒点的数量:";
cin >> n;
PI=MontePI(n);
cout<<PI<<endl;
}
 
 

ACM STUDY的更多相关文章

  1. ACM study day3

    今天练了二分和快速幂,题目挺难的,挑几个我做上的说一下吧. 先给出几个二分和快速幂的模板函数: 二分 void BS(int m) { int x=,y=a[m-]-a[]; while(y-x> ...

  2. Ubuntu 16.04 安装CodeBlocks

    首先将软件源添加进来,就是运行以下命令 sudo add-apt-repository ppa:damien-moore/codeblocks-stable sudo apt-get update 完 ...

  3. IEEE/ACM ASONAM 2014 Industry Track Call for Papers

    IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...

  4. Call for Papers IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM)

    IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...

  5. Machine Learning Algorithms Study Notes(3)--Learning Theory

    Machine Learning Algorithms Study Notes 高雪松 @雪松Cedro Microsoft MVP 本系列文章是Andrew Ng 在斯坦福的机器学习课程 CS 22 ...

  6. Machine Learning Algorithms Study Notes(2)--Supervised Learning

    Machine Learning Algorithms Study Notes 高雪松 @雪松Cedro Microsoft MVP 本系列文章是Andrew Ng 在斯坦福的机器学习课程 CS 22 ...

  7. Machine Learning Algorithms Study Notes(1)--Introduction

    Machine Learning Algorithms Study Notes 高雪松 @雪松Cedro Microsoft MVP 目 录 1    Introduction    1 1.1    ...

  8. ACM: POJ 1401 Factorial-数论专题-水题

    POJ 1401 Factorial Time Limit:1500MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu   ...

  9. IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 Industry Track Call for Papers

    IEEE/ACM International Conference on Advances in Social Network Analysis and Mining (ASONAM) 2014 In ...

随机推荐

  1. 大数据系列修炼-Scala课程06

    关于Scala中的正则表达式与模式匹配结合的正则表达式Reg 正则表达式的实现:正则表达式的定义与其它语言差不多,只需在表达式后加一个.r,并且可以遍历相应的表达式进行匹配 //定义的正则表达式 va ...

  2. 阅读小记3(《C编程专家》)

    gets()不检查缓冲区空间.多余的字符将覆盖原来的栈的内容. fgets()的第二个參数说明最大读入的字符数. 假设这个參数值为n,那么fgets()就会读取最多n-1个字符或读完一个换行符为止.两 ...

  3. csdn 博客,你很努力,有人帮你-2015年03一个月17日本

    今天泛化 开始使用简书 正则表达式的博客写了两篇文章 回顾 Core Data 基本使用 总结 Xcode6新特性 简单聊聊 简书,事实上一開始学 MarkDown 语法的时候,已经用了,但是,一直认 ...

  4. CSharp设计模式读书笔记(11):外观模式(学习难度:★☆☆☆☆,使用频率:★★★★★)

    定义: 外观模式:为子系统中的一组接口提供一个统一的入口.外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 模式角色与结构: 示例代码: using System; using Sys ...

  5. PsExec.exe执行远程程序

    PsExec.exe \\192.168.1.1 -u username -p password -i -d -s c:\Windows\system32\NETSTAT.exe -a

  6. Android游戏开发研究与主角在地图滚动

     让人感动的地图过程平滑滚动         玩过rpg朋友应该都知道RPG的游戏地图一般都比較大 今天我和大家分享一下在RPG游戏中怎样来处理超出手机屏幕大小的游戏地图. 如图所看到的为程序效果 ...

  7. POJ 3311 Hie with the Pie floyd+状压DP

    链接:http://poj.org/problem?id=3311 题意:有N个地点和一个出发点(N<=10),给出全部地点两两之间的距离,问从出发点出发,走遍全部地点再回到出发点的最短距离是多 ...

  8. php 基础算法(用*表示金字塔)通过hash 比較两个数组同样的数

    当作为一名php 程序猿,每天总与数据库打交道,做着最底层的程序猿的工作,開始着手研究一些算法,希望自己能在计算机的道路上走的更远.事实上我更喜欢管理,希望自己能作为一个卓越的管理者,但并不影响我对技 ...

  9. Ejb in action(七)——message与JMS

    我们扩大MDBs学前,我们需要理解message(新闻)与JMS(Java Message Service)的概念. 我们在Java EE中谈论消息,实际上就是意味着实现一个松耦合的过程.系统组件之间 ...

  10. Appium Android Bootstrap源码分析之命令解析执行

    通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...