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


      1.合法日期

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main()
    6. {
    7. mapint>mp;
    8. int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    9. for(int i=1;i<=12;i++)
    10. {
    11. for(int j=1;j<=days[i];j++)
    12. {
    13. string s=to_string(i)+to_string(j);
    14. mp[s]=1;
    15. }
    16. }
    17. string m,d;
    18. cin>>m>>d;
    19. m+=d;
    20. if(mp[m])cout<<"yes"<
    21. else cout<<"no"<
    22. return 0;
    23. }

     2.删除字符

    1. #include
    2. #include
    3. using namespace std;
    4. //使字典序最小,即删掉字典序大的
    5. //可以删除q次
    6. //在删除每一次时,把每一个字母删掉都试一下是不是比之前的小,如果是则贡献答案
    7. int main()
    8. {
    9. string s;
    10. cin>>s;
    11. string s1,s2,s3;
    12. s2=s3=s;
    13. int q;
    14. cin>>q;
    15. while(q--)
    16. {
    17. for(int i=0;isize();i++)
    18. {
    19. s3=s;//原来的(保证每次for循环挑选出一位)
    20. s1=s3.erase(i,1);//从i开始删除1位
    21. if(s1//s2表示上一个答案
    22. {
    23. s2=s1;
    24. }
    25. }
    26. s=s2;//for循环结束后更新s
    27. }
    28. cout<
    29. return 0;
    30. }

     3.最小谈判

    1. #include
    2. #include
    3. using namespace std;
    4. const int N=1000+10;
    5. int n;
    6. int ans;
    7. priority_queue<int,vector<int>,greater<int>>q;//小根堆
    8. int main()
    9. {
    10. cin>>n;
    11. for(int i=1;i<=n;i++)
    12. {
    13. int x;
    14. cin>>x;
    15. q.push(x);
    16. }
    17. while(q.size()!=1)
    18. {
    19. if(q.size()==1)break;
    20. //每次取出最小的两个
    21. int t1=q.top();
    22. q.pop();
    23. int t2=q.top();
    24. q.pop();
    25. ans+=(t1+t2);
    26. q.push(t1+t2);
    27. }
    28. cout<
    29. return 0;
    30. }

     4.排列小球

    1. #include
    2. using namespace std;
    3. //有限制地枚举方案,采用dfs可以进行搜索和回溯
    4. int sum;//三个小球的总数量
    5. int a[3];//三个小球各自的数量
    6. int ans;//答案即方案数
    7. void dfs(int sum,int x,int last)
    8. {
    9. //sum为目前还未放入进行排列的小球的数量,x为目前要放入小球的数量,
    10. //last为上次放小球的小球颜色
    11. if(sum==0)
    12. {
    13. //若能够全部放完则记录一次答案
    14. ans++;
    15. return;
    16. }
    17. for(int i=0;i<3;i++)//枚举三种颜色的小球,看那种符合题意
    18. {
    19. if(i==last)//颜色相同则跳过
    20. continue;
    21. //找到不同颜色的
    22. for(int j=x+1;j<=a[i];j++)//从x+1开始枚举
    23. {
    24. a[i]-=j;
    25. dfs(sum-j,j,i);
    26. a[i]+=j;//恢复现场
    27. }
    28. }
    29. }
    30. int main()
    31. {
    32. for(int i=0;i<3;i++)
    33. {
    34. cin>>a[i];
    35. sum+=a[i];
    36. }
    37. dfs(sum,0,-1);
    38. cout<
    39. return 0;
    40. }

     5.灌溉

    1. #include
    2. using namespace std;
    3. const int N=110;
    4. int a[N][N];
    5. int b[N][N];
    6. int n,m,t,k,ans;
    7. int dx[]={-1,1,0,0};
    8. int dy[]={0,0,-1,1};
    9. int main()
    10. {
    11. cin>>n>>m>>t;
    12. while(t--)
    13. {
    14. int x,y;
    15. cin>>x>>y;
    16. a[x][y]=1;
    17. b[x][y]=2;//为出水管
    18. }
    19. cin>>k;
    20. for(int g=1;g<=k;g++)
    21. {
    22. for(int i=1;i<=n;i++)
    23. {
    24. for(int j=1;j<=m;j++)
    25. {
    26. if(a[i][j]==1)
    27. {
    28. for(int p=0;p<4;p++)
    29. {
    30. int xx=i+dx[p];
    31. int yy=j+dy[p];
    32. if(xx<1||xx>n||yy<1||yy>m)continue;
    33. b[xx][yy]=1;
    34. }
    35. }
    36. }
    37. }
    38. for(int i=1;i<=n;i++)
    39. {
    40. for(int j=1;j<=m;j++)
    41. {
    42. if(b[i][j]==2||b[i][j]==0)continue;
    43. a[i][j]=b[i][j];
    44. }
    45. }
    46. }
    47. for(int i=1;i<=n;i++)
    48. {
    49. for(int j=1;j<=m;j++)
    50. {
    51. if(a[i][j]==1)ans++;
    52. }
    53. }
    54. cout<
    55. return 0;
    56. }

    6.受伤的皇后

    1. #include
    2. using namespace std;
    3. const int N=15;
    4. int a[N];//a[i]=j表示第i行中放在了第j列
    5. int n;
    6. int ans;
    7. bool isvalid(int row,int i)
    8. {
    9. //判断已经放好的前row-1行是否可行
    10. for(int j=1;j
    11. {
    12. if(a[j]==i||(row+i==a[j]+j&&row-j<3)||(row-i==j-a[j]&&row-j<3))
    13. return false;
    14. }
    15. return true;
    16. }
    17. //注意:反对角线:x+y==定值;正对角线:x-y==定值
    18. void dfs(int row)//代码前row-1行已经放好,现在要放第row行
    19. {
    20. if(row==n+1)//前面n行已经放好了
    21. {
    22. ans++;
    23. return;
    24. }
    25. for(int i=1;i<=n;i++)//枚举是否可行的列
    26. {
    27. if(isvalid(row,i))
    28. {
    29. a[row]=i;
    30. dfs(row+1);
    31. a[row]=0;
    32. }
    33. }
    34. }
    35. int main()
    36. {
    37. cin>>n;
    38. dfs(1);//表示前0行已经摆好了就OK
    39. //注意不能是dfs(0),表示前0-1行已经摆好了,不行!!
    40. cout<
    41. return 0;
    42. }

    7.跳跃

    1. #include
    2. using namespace std;
    3. const int N=110;
    4. const int MIN=-1e9;
    5. int f[N][N];
    6. int n,m;
    7. //注意9个方向!(特别是后三个)
    8. int dx[]={-1,-2,-3,0,0,0,-1,-1,-2};
    9. int dy[]={0,0,0,-1,-2,-3,-1,-2,-1};
    10. //动态规划的思想
    11. int main()
    12. {
    13. cin>>n>>m;
    14. for(int i=1;i<=n;i++)
    15. {
    16. for(int j=1;j<=m;j++)
    17. {
    18. cin>>f[i][j];
    19. }
    20. }
    21. for(int i=1;i<=n;i++)
    22. {
    23. for(int j=1;j<=m;j++)
    24. {
    25. //找到可以从9个方向下来中的最大值
    26. int temp=MIN;
    27. for(int k=0;k<9;k++)
    28. {
    29. int xx=i+dx[k];
    30. int yy=j+dy[k];
    31. if(xx<1||xx>n||yy<1||yy>m)continue;
    32. temp=max(temp,f[xx][yy]);
    33. }
    34. if(temp!=MIN)//找到了才进行更新
    35. {
    36. f[i][j]+=temp;
    37. }
    38. }
    39. }
    40. cout<
    41. return 0;
    42. }

    8.逆序对数

    1. #include
    2. using namespace std;
    3. // 求逆序对-->归并排序
    4. int q[]={87,39,35,1,99,10,54,1,46,24,74,62,49,13,2,80,24,58,8,14,83,23,97,85,3,2,86,10,71,15};
    5. int temp[33];
    6. int ans=0;
    7. void merge_sort(int q[],int l,int r)
    8. {
    9. if (l >= r)return ;
    10. int mid= (l + r) / 2;
    11. merge_sort(q, l, mid);
    12. merge_sort(q, mid + 1, r);
    13. int k = 0, i = l, j = mid + 1;
    14. while (i <= mid && j <= r)
    15. {
    16. if (q[i] <= q[j])temp[k++] = q[i++];//注意等号!!
    17. else
    18. {
    19. temp[k++] = q[j++];
    20. ans += mid - i + 1;
    21. }
    22. }
    23. while (i <= mid)temp[k++] = q[i++];
    24. while (j <= r)temp[k++] = q[j++];
    25. for (i = l, j = 0; i <= r; i++, j++)q[i] = temp[j];//注意赋值!
    26. }
    27. int main()
    28. {
    29. merge_sort(q,0,29);
    30. cout<
    31. return 0;
    32. }

  • 相关阅读:
    Xilinx MicroBlaze定时器中断无法返回主函数问题解决
    MySQL添加、查看、修改与删除数据
    FITC-Dextran荧光素标记葡聚糖-星戈瑞
    2011年03月17日 Go生态洞察:探索Go与C的交互——Cgo
    217页企业大数据能力平台建设技术方案
    ASP.NET Core的全局拦截器(在页面回发时,如果判断当前请求不合法,不执行OnPost处理器)
    【云原生】简单谈谈分布式存储组件HBase
    java计算机毕业设计交通非现场执法系统源码+mysql数据库+系统+lw文档+部署
    数据结构与算法学习(day1)——简化版桶排序
    Spring IOC源码:registerBeanPostProcessors 详解
  • 原文地址:https://blog.csdn.net/gyeolhada/article/details/136352930