• crp Week1周报


    P8682 [蓝桥杯 2019 省 B] 等差数列

    1.思路:找所有两个数间的差值的最大公约数即可

    2.代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int a[100005];
    4. int gcd(int x,int y)
    5. {
    6. int c;
    7. c=x%y;
    8. while(c!=0)
    9. {
    10. x=y;
    11. y=c;
    12. c=x%y;
    13. }
    14. return y;
    15. }
    16. int main()
    17. {
    18. int n;
    19. cin>>n;
    20. for(int i=1;i<=n;i=i+1)
    21. {
    22. cin>>a[i];
    23. }
    24. sort(a+1,a+n+1);
    25. int z=a[2]-a[1];
    26. if(z==0)
    27. {
    28. cout<<n;
    29. }
    30. else
    31. {
    32. for(int i=3;i<=n;i=i+1)
    33. {
    34. z=gcd(z,a[i]-a[i-1]);
    35. }
    36. cout<<(a[n]-a[1])/z+1;
    37. }
    38. }

    P1226 【模板】快速幂

    1.用途:让计算机很快地算出a^b

    2.模板代码:

    1. long long quickpower(long long a,long long b)
    2. {
    3. long long ans=1;
    4. long long base=a;
    5. while(b>0)
    6. {
    7. if(b&1)
    8. {
    9. ans*=base;
    10. }
    11. base*=base;
    12. b>>=1;
    13. }
    14. return ans;
    15. }

    3.改进模板代码:(先乘到最后再取余)

    1. long long quickpower(long long a,long long b,long long p)
    2. {
    3. long long ans=1;
    4. long long base=a;
    5. while(b>0)
    6. {
    7. if(b&1)
    8. {
    9. ans*=base;
    10. ans%=p;
    11. }
    12. base*=base;
    13. base%=p;
    14. b>>=1;
    15. }
    16. return ans;
    17. }

    4.本题代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. long long quickpower(long long a,long long b,long long p)
    4. {
    5. long long ans=1;
    6. long long base=a;
    7. while(b>0)
    8. {
    9. if(b&1)
    10. {
    11. ans*=base;
    12. ans%=p;
    13. }
    14. base*=base;
    15. base%=p;
    16. b>>=1;
    17. }
    18. return ans;
    19. }
    20. int main()
    21. {
    22. long long a,b,p;
    23. cin>>a>>b>>p;
    24. cout<<a<<"^"<<b<<" mod "<<p<<"=";
    25. cout<<quickpower(a,b,p);
    26. }

    P2249 【深基13.例1】查找

    1.思路:用lower_bound和upper_bound

    2.原理:二分查找,lower_bound (首,尾,需要查找的元素)查找首个不小于给定值的函数,upper_bound查找大于目标值的元素

    3.用法:int h=upper_bound(a+1,a+n+1,x)-a//存储了第一个大于x的数的位置

    4.本题代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int a[1000005];
    4. int main()
    5. {
    6. int n,m;
    7. cin>>n>>m;
    8. for(int i=1;i<=n;i=i+1)
    9. {
    10. cin>>a[i];
    11. }
    12. for(int i=1;i<=m;i=i+1)
    13. {
    14. int k;
    15. cin>>k;
    16. int h=lower_bound(a+1,a+n+1,k)-a;
    17. if(a[h]==k)
    18. {
    19. cout<<h<<" ";
    20. }
    21. else
    22. {
    23. cout<<-1<<" ";
    24. }
    25. }
    26. }

    P1824 进击的奶牛

    1.原理:二分查找

    2.用途:寻找最大最小值或最小最大值,可行解对于区间满足单调性

    3.本题代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int n,c;
    4. int a[100005];
    5. bool check(int k)
    6. {
    7. int ans=1;
    8. int now=a[1];
    9. for(int i=2;i<=n;i=i+1)
    10. {
    11. if(a[i]-now>=k)
    12. {
    13. ans++;
    14. now=a[i];
    15. if(ans==c)
    16. {
    17. return 1;
    18. }
    19. }
    20. }
    21. return 0;
    22. }
    23. int find()
    24. {
    25. int l=1;
    26. int r=1e9+1;
    27. while(l+1<r)
    28. {
    29. int mid=(l+r)/2;
    30. if(check(mid))
    31. {
    32. l=mid;
    33. }
    34. else
    35. {
    36. r=mid;
    37. }
    38. }
    39. return l;
    40. }
    41. int main()
    42. {
    43. cin>>n>>c;
    44. for(int i=1;i<=n;i=i+1)
    45. {
    46. cin>>a[i];
    47. }
    48. sort(a+1,a+n+1);
    49. cout<<find();
    50. }

    P2118 [NOIP2014 普及组] 比例简化

    1.思路:暴力枚举,l的范围小于等于100

    2.本题代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. int gcd(int x,int y)
    4. {
    5. int c;
    6. c=x%y;
    7. while(c!=0)
    8. {
    9. x=y;
    10. y=c;
    11. c=x%y;
    12. }
    13. return y;
    14. }
    15. int main()
    16. {
    17. int a,b,l;
    18. cin>>a>>b>>l;
    19. int za=l;
    20. int zb=1;
    21. for(int i=1;i<=l;i=i+1)
    22. {
    23. for(int j=1;j<=l;j=j+1)
    24. {
    25. if(a*j<=b*i)
    26. {
    27. if(za*j>zb*i)
    28. {
    29. za=i;
    30. zb=j;
    31. }
    32. }
    33. }
    34. }
    35. cout<<za<<" "<<zb;
    36. }

    P1024 [NOIP2001 提高组] 一元三次方程求解

    1.思路:暴力枚举,由于解的范围在-100到100之间,且精度为0.001,枚举次数在1e6次之内

    2.本题代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. double a,b,c,d;
    4. double da(double k)
    5. {
    6. return a*k*k*k+b*k*k+c*k+d;
    7. }
    8. int main()
    9. {
    10. cin>>a>>b>>c>>d;
    11. for(double i=-100;i<=100;i=i+0.001)
    12. {
    13. double j=i+0.001;
    14. if(da(i)==0)
    15. {
    16. cout<<fixed<<setprecision(2)<<i<<" ";
    17. }
    18. else if(da(i)*da(j)<0)
    19. {
    20. cout<<fixed<<setprecision(2)<<i<<" ";
    21. }
    22. }
    23. }

    P1873 [COCI2011-2012#5] EKO / 砍树

    1.思路:二分查找

    2.用途:寻找最大最小值或最小最大值,可行解对于区间满足单调性

    3.本题代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. bool check(int*a,int n,int mid,int m)
    4. {
    5. long long sum=0;
    6. for(int i=1;i<=n;i=i+1)
    7. {
    8. if(a[i]>mid)
    9. sum=sum+a[i]-mid;
    10. }
    11. if(sum>=m)
    12. {
    13. return 1;
    14. }
    15. else
    16. {
    17. return 0;
    18. }
    19. }
    20. int main()
    21. {
    22. int n,m;
    23. cin>>n>>m;
    24. int a[n+1];
    25. int r=0;
    26. for(int i=1;i<=n;i=i+1)
    27. {
    28. cin>>a[i];
    29. r=max(r,a[i]);
    30. }
    31. int l=1;
    32. int max;
    33. while(l<=r)
    34. {
    35. int mid=(l+r)/2;
    36. if(check(a,n,mid,m))
    37. {
    38. l=mid+1;
    39. max=mid;
    40. }
    41. else
    42. {
    43. r=mid-1;
    44. }
    45. }
    46. cout<<max;
    47. return 0;
    48. }

    P3382 【模板】三分

    1.用途:三分可用来求单峰/单谷函数的极值,确定函数表达式后,就可在O(log3n)的复杂度求出该函数的极值

    2.原理:每次取L,R的中点mid,把mid左边一点点函数值和右边一点点函数值比较,舍弃一边区间,这样不断缩小区间直到满足精度要求即可

    3.本题代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. const double eps=1e-6;
    4. int n;
    5. double l,r;
    6. double a[15];
    7. double f(double x)
    8. {
    9. double sum=0;
    10. for(int i=n;i>=0;i--)
    11. {
    12. sum=sum*x+a[i];
    13. }
    14. return sum;
    15. }
    16. int main()
    17. {
    18. cin>>n>>l>>r;
    19. for(int i=n;i>=0;i--)
    20. {
    21. cin>>a[i];
    22. }
    23. while(fabs(l-r)>=eps)
    24. {
    25. double mid=(l+r)/2;
    26. if(f(mid+eps)>f(mid-eps))
    27. {
    28. l=mid;
    29. }
    30. else
    31. {
    32. r=mid;
    33. }
    34. }
    35. cout<<fixed<<setprecision(5)<<r;
    36. return 0;
    37. }

    P2678 [NOIP2015 提高组] 跳石头

    1.原理:二分查找

    2.用途:寻找最大最小值或最小最大值,可行解对于区间满足单调性

    3.本题代码:

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. bool check(int mid,int*a,int m,int n)
    4. {
    5. int now=a[0];
    6. for(int i=1;i<=n+1;i=i+1)
    7. {
    8. if(a[i]-now<mid)
    9. {
    10. m=m-1;
    11. }
    12. else
    13. {
    14. now=a[i];
    15. }
    16. if(m<0)
    17. {
    18. return 0;
    19. }
    20. }
    21. return 1;
    22. }
    23. int main()
    24. {
    25. int l,n,m;
    26. cin>>l>>n>>m;
    27. int a[n+2];
    28. a[0]=0;
    29. a[n+1]=l;
    30. for(int i=1;i<=n;i=i+1)
    31. {
    32. cin>>a[i];
    33. }
    34. int i=1;
    35. int j=l;
    36. int max=1;
    37. while(i<=j)
    38. {
    39. int mid=(i+j)/2;
    40. if(check(mid,a,m,n))
    41. {
    42. i=mid+1;
    43. max=mid;
    44. }
    45. else
    46. {
    47. j=mid-1;
    48. }
    49. }
    50. cout<<max;
    51. }
  • 相关阅读:
    Java数学工具类Math
    QT自定义空间之软键盘
    【Qt】 FFmpeg+Qt windows 32位或者64位环境搭建
    Intel汇编-JMP无条件调转
    js逆向第一课 密码学介绍
    POSIX线程与Win32线程
    网页大作业代码自取【HTML+CSS制作美味糖果网站】
    知识图谱:推理【单跳查询(1-hop)、路径查询(2-hop、3-hop)、联合查询(conjunctive query)】
    ListMapToExcel
    基于Go语言Iris+Xorm搭建MVC项目教程
  • 原文地址:https://blog.csdn.net/cruipeng/article/details/133698500