• 蓝桥杯备战刷题five(自用)


    1.数字三角形(方向次数限制,动态规划)

      //如果n为奇数时,最后必然走到最后行最中间的数,如果为偶数,则取中间两个数的最大值,
      //因为向左下走的次数与向右下走的次数相差不能超过 1

    1. #include
    2. using namespace std;
    3. const int N=110;
    4. int g[N][N];
    5. int f[N][N];
    6. int n;
    7. int ans;
    8. int main()
    9. {
    10. cin>>n;
    11. for(int i=1;i<=n;i++)
    12. {
    13. for(int j=1;j<=i;j++)
    14. {
    15. cin>>g[i][j];
    16. }
    17. }
    18. for(int i=1;i<=n;i++)
    19. {
    20. for(int j=1;j<=i;j++)
    21. {
    22. f[i][j]=max(f[i-1][j],f[i-1][j-1])+g[i][j];
    23. }
    24. }
    25. //如果n为奇数时,最后必然走到最后行最中间的数,如果为偶数,则取中间两个数的最大值,
    26. //因为向左下走的次数与向右下走的次数相差不能超过 1
    27. if(n%2)cout<2+1];
    28. else cout<<max(f[n][n/2],f[n][n/2+1]);
    29. return 0;
    30. }

    2.作物杂交(DFS,递归)

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. const int N=2000+100;
    6. int n,m,k,t;
    7. vectorint,int>> fa[N];
    8. int tim[N];
    9. int f[N];//f[i]表示得到i需要花费的时间
    10. map<int,int>mp;
    11. int ans;
    12. int dfs(int t)//倒着推
    13. {
    14. for(int i=0;isize();i++)
    15. {
    16. int a=fa[t][i].first;
    17. int b=fa[t][i].second;
    18. if(!mp[a])dfs(a);
    19. if(!mp[b])dfs(b);
    20. if(mp[a]&&mp[b])
    21. {
    22. mp[t]=1;
    23. f[t]=min(f[t],max(tim[a],tim[b])+max(f[a],f[b]));
    24. }
    25. }
    26. return f[t];
    27. }
    28. int main()
    29. {
    30. cin>>n>>m>>k>>t;
    31. for(int i=1;i<=n;i++)
    32. {
    33. cin>>tim[i];
    34. f[i]=1e9;//初始都是得不到的
    35. }
    36. for(int i=1;i<=m;i++)
    37. {
    38. int x;
    39. cin>>x;
    40. mp[x]=1;
    41. f[x]=0;//已经有了,得到的时间为0
    42. }
    43. for(int i=1;i<=k;i++)
    44. {
    45. int a,b,c;
    46. cin>>a>>b>>c;
    47. fa[c].push_back({a,b});
    48. }
    49. cout<<dfs(t);
    50. return 0;
    51. }

    3.Excel地址(思维)

    1. #include
    2. #include
    3. using namespace std;
    4. int main()
    5. {
    6. long long n;
    7. cin>>n;
    8. vector<char>v;
    9. while(n)
    10. {
    11. n--;//0-25表示A-Z,所以先减一
    12. v.push_back(n%26+'A');//贡献当前位的表示
    13. n/=26;//贡献当前位的权
    14. }
    15. for(int i=v.size()-1;i>=0;i--)
    16. cout<
    17. return 0;
    18. }

    4.k倍区间(思维)

    组合求法,假设%k值相等的区间有n个,根据得出的结论发现任何两个前缀区间的和对k取模的值相等,则由大的前缀区间减掉小的前缀区间所形成的区间的必定是K倍区间。那n个中取任何两个区间都可以组成k倍区间,问有多少k倍区间,就转换成n个区间取两个的情况有多少个,就是Cn2=n*(n-1)/2,所以对于每个%k值相等的区间都添加一次组合就可以算出总共有多少k倍区间了

    1. #include
    2. using namespace std;
    3. const int N=1e5+10;
    4. #define ll long long
    5. ll sum;
    6. ll cnt[N];//cnt[i]表示与k取模后余i的个数
    7. int a[N];
    8. int n,k;
    9. ll ans;
    10. int main()
    11. {
    12. cin>>n>>k;
    13. for(int i=1;i<=n;i++)
    14. {
    15. cin>>a[i];
    16. sum=sum+a[i];//计算前缀和
    17. cnt[sum%k]++;//统计所有前缀和%k后的余数相同个数
    18. }
    19. //余数为0直接就是k的倍数l
    20. ans+=cnt[0];
    21. //剩下的余数相同的前缀和选2个相同的进行相减
    22. //即可得到一个子区间且和是k的倍数
    23. for(int i=0;i
    24. {
    25. //组合数cnt[i]个数选两个:C(n,2)=n*(n-1)/2
    26. //求得的组合数即所有组合即可贡献答案
    27. ans+=cnt[i]*(cnt[i]-1)/2;
    28. }
    29. cout<
    30. return 0;
    31. }

    (思路来自Moon) 

     5.包子凑数(动态规划)

    1. #include
    2. using namespace std;
    3. const int N=110;
    4. const int M=1e4;
    5. int n;
    6. int a[N];
    7. int f[M];//f[i]=0表示i个包子凑不出来,f[i]=1表示i个包子凑得出来
    8. int gcd(int a,int b)//用来判断是否互质,若全不互质那肯定凑不出来无限个
    9. {
    10. return b?gcd(b,a%b):a;
    11. }
    12. int main()
    13. {
    14. cin>>n;
    15. for(int i=0;i
    16. {
    17. cin>>a[i];
    18. }
    19. //求出数组a的最大公因数
    20. int g=gcd(a[0],a[1]);
    21. for(int i=2;i
    22. {
    23. g=gcd(g,a[i]);
    24. }
    25. //如果最大公因数大于1,肯定无法表示的有无限
    26. if(g>1)
    27. {
    28. cout<<"INF"<
    29. }
    30. else
    31. {
    32. int ans=0;
    33. f[0]=1;//0个包子肯定可以
    34. for(int i=0;i
    35. {
    36. for(int j=0;j+a[i]
    37. {
    38. if(f[j])
    39. {
    40. f[j+a[i]]=1;
    41. }
    42. }
    43. }
    44. for(int i=0;i
    45. {
    46. if(!f[i])
    47. {
    48. ans++;
    49. }
    50. }
    51. cout<
    52. }
    53. return 0;
    54. }

    7.分巧克力(二分)

    以下是错误代码!!(注意切巧克力是有边的限制的,不能使用面积,面积满足但是形状不满足的巧克力是不合法的!!) 

    1. #include
    2. #include
    3. using namespace std;
    4. const int N=1e5+10;
    5. #define ll long long
    6. int n,k;
    7. int b=1e9;
    8. int cnt=0;
    9. ll sum[N];
    10. int main()
    11. {
    12. cin>>n>>k;
    13. for(int i=1;i<=n;i++)
    14. {
    15. int h,w;
    16. cin>>h>>w;
    17. int kk=(int)sqrt(h*w);
    18. b=min(b,kk);
    19. sum[i]=(ll)h*w;
    20. }
    21. for(int i=1;i<=n;i++)
    22. {
    23. cnt+=(sum[i]/(b*b));
    24. }
    25. if(cnt>=k)
    26. cout<
    27. else
    28. {
    29. while(cnt
    30. {
    31. b--;
    32. cnt=0;
    33. for(int i=1;i<=n;i++)
    34. {
    35. cnt+=(sum[i]/(b*b));
    36. }
    37. }
    38. cout<
    39. }
    40. return 0;
    41. }

    1. #include
    2. #include
    3. using namespace std;
    4. const int N=1e5+10;
    5. #define ll long long
    6. int n,k;
    7. int ans;
    8. int h[N],w[N];
    9. bool check(int x)
    10. {
    11. int cnt=0;
    12. for(int i=1;i<=n;i++)
    13. {
    14. cnt+=(h[i]/x)*(w[i]/x);//有多少个x的高,多少个x的宽,这样才能切出巧克力
    15. }
    16. return cnt>=k;
    17. }
    18. int main()
    19. {
    20. cin>>n>>k;
    21. for(int i=1;i<=n;i++)
    22. {
    23. cin>>h[i]>>w[i];
    24. }
    25. int l=1;
    26. int r=N;
    27. while(l<=r)
    28. {
    29. int mid=(l+r)/2;
    30. if(check(mid))
    31. {
    32. ans=mid;//ans是符合要求的,不断取大的
    33. l=mid+1;
    34. }
    35. else
    36. {
    37. r=mid-1;
    38. }
    39. }
    40. cout<
    41. return 0;
    42. }

    8.九宫幻方(DFS)

    1. #include
    2. #include
    3. using namespace std;
    4. int a[4][4];
    5. int ans[4][4];
    6. int n,cnt;
    7. pair<int,int>p[10];
    8. map<int,int>mp;
    9. bool check()
    10. {
    11. int sum=a[1][1]+a[2][2]+a[3][3];
    12. if(sum!=a[1][3]+a[2][2]+a[3][1])return 0;
    13. for(int i=1;i<=3;i++)
    14. {
    15. int temp1=0,temp2=0;
    16. for(int j=1;j<=3;j++)
    17. {
    18. temp1+=a[i][j];
    19. temp2+=a[j][i];
    20. }
    21. if(temp1!=sum||temp2!=sum)return 0;
    22. }
    23. return 1;
    24. }
    25. void dfs(int now)
    26. {
    27. if(now>n)//也就是所有为0的点都已经遍历完了
    28. {
    29. if(check())
    30. {
    31. cnt++;
    32. for(int i=1;i<=3;i++)
    33. {
    34. for(int j=1;j<=3;j++)
    35. {
    36. ans[i][j]=a[i][j];
    37. }
    38. }
    39. }
    40. return;
    41. }
    42. //x和y表示可以填数的点
    43. int x=p[now].first,y=p[now].second;
    44. for(int i=1;i<=9;i++)
    45. {
    46. if(mp[i])continue;//填过的不可以再填
    47. a[x][y]=i;
    48. mp[i]=1;
    49. dfs(now+1);
    50. a[x][y]=0;
    51. mp[i]=0;
    52. }
    53. }
    54. int main()
    55. {
    56. for(int i=1;i<=3;i++)
    57. {
    58. for(int j=1;j<=3;j++)
    59. {
    60. cin>>a[i][j];
    61. if(!a[i][j])p[++n]=make_pair(i,j);
    62. mp[a[i][j]]=1;
    63. }
    64. }
    65. dfs(1);
    66. if(cnt==1)
    67. {
    68. for(int i=1;i<=3;i++)
    69. {
    70. for(int j=1;j<=3;j++)
    71. {
    72. cout<" \n"[j==3];
    73. }
    74. }
    75. }
    76. else cout<<"Too Many\n";
    77. return 0;
    78. }

  • 相关阅读:
    如何基于YAML设计接口自动化测试框架?看完秒会!
    老牌好用免费的数据恢复软件easyrecovery操作简单一键恢复
    基于PLC的污水厌氧处理控制系统(论文+源码)
    为什么力扣中std::sort的cmp函数不加static会出错?
    Django 模型层的操作(Django-05 )
    上周热点回顾(5.15-5.21)
    线上宕机问题(索引问题)
    CSP-2023 复赛游记
    周星驰亲自下场招人 Web3.0究竟是什么?
    论文解读 | KPConv——点云上的可形变卷积网络
  • 原文地址:https://blog.csdn.net/gyeolhada/article/details/136423294