蓝桥杯C++ AB组辅导课 3.1数学与简单DP (待完善)

一、数学

考察一些数学模型,类似脑筋急转弯,小学奥数。(可以去训练训练)

1025.买不到的数目

 给出来两个整数p、q,要求xq+yp不能组成的最大的数

  1. 首先,如果d = p、q最大公约数>1,那么它就只能组成其最大公约数倍数,其余的都无法组成,这样的答案就是无解的。
  2. 如果p与q互质,即d = 1,是否一定有解?(裴蜀定理:);

其实到第二步可以开始打表找规律

        

蓝桥杯C++ AB组辅导课 3.1数学与简单DP (待完善)_第1张图片

 这里无法理解dfs函数,思路,递归搜索树

打表出来的结果:

蓝桥杯C++ AB组辅导课 3.1数学与简单DP (待完善)_第2张图片

 以3  n  m表示,找到规律 n+1 m+2,可以得到 m = 2*n + x(x是某个值)得出 x = -3,m = 2*n-3;

接下来改变 3为5 ,找到规律 m = 4*n-... 

                                                   =(p-1)*n-... 枚举p、q结果应该是相同的 所以应该是=(p-1)(q-1)再猜个-1

定理:p、q互质,不能被p、q凑出来的数字就是(p-1)(q-1)-1。(证明在小凯的疑惑题解)

代码实现:略

1211.蚂蚁感冒

算法思想:

        蓝桥杯C++ AB组辅导课 3.1数学与简单DP (待完善)_第3张图片

 代码实现:

#include 
using namespace std;
int x[55];
int main(){
    int n;cin>>n;
    for(int i = 0;i>x[i];
    
    int left = 0,right = 0;//统计左边向右的left和右边向左right的个数
    for(int i = 0;i0) left++;
        if(abs(x[i])>abs(x[0]) && x[i]<0) right++;
    }
        /*向右 right>0则left+right+1 right = 0则1
        向左 left>0则left+right+1 left = 0则1*/
        if((x[0]>0 && right==0) || (x[0]<0&&left==0)) cout<<1;
        else cout<

PS:
上取整:ceil()(返回 double类型)需要转化成int;或者(a+b-1)/b;

下取整 

你可能感兴趣的:(蓝桥杯,算法)