蓝桥杯带刷题(二)

简介: 蓝桥杯带刷题

D::::::::::::::::::数数(思维)


问题描述

任何一个大于 1 的正整数都能被分解为若干个质数相乘, 比如 28=2×2×7 被分解为了三个质数相乘。请问在区间 [2333333, 23333333] 中有多少个正整数 可以被分解为 12 个质数相乘?


答案提交

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。


运行限制

最大运行时间:1s

最大运行内存: 512M

上千万的数据量,不可能12个循环吧

#include <iostream>
#include <vector>
using namespace std;
int ans;
bool sushu(int x){
  if(x==1){
    return false;
  }
  if(x==2){
    return true;
  }
  for(int i=2;i*i<=x;i++){
    if(x%i==0){
      return false;
    }
  }
  return true;
}
int su[23333339];
vector<int> p;
int main(){
  long long a=2333333;
  long long b=23333333;
  for(int i=2;i<=b;i++){
    if(!su[i]&&sushu(i)){
      su[i]=1;             //su[i]=1,代表i由一个数的值 
      p.push_back(i);      //素数压入动态数组 
    }
    if(i>=a&&su[i]==12){   //判断是否是12个数的乘积 
      ans++;
    }                     //当i==a时,p中是2到a的所有素数 
    for(vector<int>::iterator it=p.begin();it!=p.end();it++){
      if(i* *it>b){
        break;
      }else{
        su[i* *it]=su[i]+1;   //i* *it两个乘积,再i的基础上乘以*it,所以值加一; 
      }
    }
  }
  cout<<ans;
  return 0;
}


半分钟出答案,还是慢点,填空题无所谓了


 E::::::::::::::::::约瑟夫杯(队列,循环列表)


题目描述

设有 nn 个人围坐在圆桌周围,现从某个位置 kk 上的人开始报数,报数到 m 的人就站出来。下一个人,即原来的第 m+1 个位置上的人,又从 11 开始报数,再报数到 m 的人站出来。依次重复下去,直到全部的人都站出来为止。试设计一个程序求出这 n 个人的出列顺序。

要求一:采用循环链表解决。


要求二:可以使用模拟法,模拟循环链表。


要求三:可以不使用循环链表类的定义使用方式。


输入描述

输入只有一行且为用空格隔开的三个正整数 n,k,m,其含义如上所述。


输出描述

共 n 行,表示这 n 个人的出列顺序。


输入输出样例

示例 1


输入

3 5 8

输出

3
2
1

队列方法:

#include <iostream>
#include <queue>
using namespace std;
queue<int> q;
int n,k,m;     //n个人,k开始,m出 
int main(){
  cin>>n>>k>>m;
  k=k%n; 
  for(int i=k;i<=n;i++){
    q.push(i);
  }
  for(int i=1;i<k;i++){
    q.push(i);
  }
  while(!q.empty()){
    for(int i=1;i<m;i++){
      int c=q.front();
      q.pop();
      q.push(c); 
    }
    int c=q.front();
    cout<<c<<endl;
    q.pop();
  }
  return 0;
} 


循环链表方法:

#include <iostream>
using namespace std;
typedef struct node
{
  int data;
  struct node* next;
}LNode, *Linklist;
void initlink(Linklist &head, int n)
{
  head = new LNode;
  LNode * p = head;
  p->data = 1;
  for (int i = 2; i <= n; i++)
  {
    p->next = new LNode;
    p = p->next;
    p->data = i;
    }
  p->next = head;       
}
void baoshu(Linklist &head, int k, int m)
{
  LNode *p = head;
  for (int i = 1; i < k; i++)
      p = p->next;
  while (p->next != p)
  {
    for (int j = 1; j < m - 1; j++)  p = p->next;
    cout << p->next->data << endl;
    p->next = p->next->next;
    p = p->next;
  }
  cout << p->data;
}
int main()
{
    int n, k, m;
    cin >> n >> k >> m;
    Linklist head;
    initlink(head, n);
    baoshu(head, k, m);
}

 F::::::::::::::::::移动字母(DFS,BFS)


题目描述

2x3=6 个方格中放入 ABCDE 五个字母,右下角的那个格空着。如下图所示。

和空格子相邻的格子中的字母可以移动到空格中,比如,图中的 C 和 E 就可以移动,移动后的局面分别是:


A B


D E C


A B C


D E


为了表示方便,我们把 6 个格子中字母配置用一个串表示出来,比如上边的两种局面分别表示为:


AB*DEC


ABCD*E


题目的要求是:请编写程序,由用户输入若干表示局面的串,程序通过计算,输出是否能通过对初始状态经过若干次移动到达该状态。可以实现输出 1,否则输出 0。初始状态为:ABCDE*。


输入描述

先是一个整数 nn,表示接下来有 nn 行状态。


输出描述

程序输出 nn 行 1 或 0。


输入输出样例

示例


输入

7 BCDEA* DAECB* ECABD* BCDAE* DAEBC* ECADB* EDCAB*

输出

1 1 1 0 0 0 0
#include <iostream>
#include <map>
using namespace std;
int n;
string a[2];
string b[2];
int bb[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
bool res;
map<string,bool> vis;
bool check1(){
  for(int i=0;i<2;i++){
    for(int j=0;j<3;j++){
      if(a[i][j]!=b[i][j]){
        return false;
      }
    }
  }
  return true;
}
bool check2(int x,int y){
  return x>=0&&x<2&&y>=0&&y<3;
}
void dfs(int x,int y){
  if(res){
    return;
  }
  if(check1()){
    res=true;
    return;
  }
  for(int i=0;i<4;i++){
    int tx=x+bb[i][0];
    int ty=y+bb[i][1];
    if(check2(tx,ty) ){
      char c=a[x][y];
      a[x][y]=a[tx][ty];
      a[tx][ty]=c;
      if(!vis[a[0]+a[1]]) {
        vis[a[0]+a[1]]=1;
        dfs(tx,ty);
      }
      c=a[x][y];
      a[x][y]=a[tx][ty];
      a[tx][ty]=c;
    }
  }
}
int main(){
  cin>>n;
  for(int i=0;i<n;i++){
    a[0]="ABC";
    a[1]="DE*";
    for(int i=0;i<2;i++){
      for(int j=0;j<3;j++){
        cin>>b[i][j];
      }
    }
    res=false;
    vis.clear();
    dfs(1,2);
    if(res){
      cout<<1<<endl;
    }else{
      cout<<0<<endl;
    }
  }
  return 0;
}
相关文章
|
5月前
|
Java
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
51 0
|
6月前
|
算法 安全 定位技术
【刷题】备战蓝桥杯 — dfs 算法
dfs算法在数据较小的情况下可以使用。 一定一定要确定好终止条件,避免栈溢出。 相应做好回溯,保证每次的遍历都是不一样的选择,避免少结果。 针对题目进行对应细节处理,有能力的话可以进行剪枝优化!!!
66 0
|
6月前
蓝桥杯备战刷题-滑动窗口
蓝桥杯备战刷题-滑动窗口
44 0
|
安全 算法
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(16)
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(16)
111 0
|
机器学习/深度学习 算法 定位技术
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(15)
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(15)
111 0
|
算法 定位技术
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(7)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(7)
98 0
|
6月前
|
C++
第十三届蓝桥杯B组C++(试题C:刷题统计)
第十三届蓝桥杯B组C++(试题C:刷题统计)
50 0
|
算法
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
118 0
|
算法
【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11
【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11
97 0
|
算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(10)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(10)
116 0