蓝桥杯带刷题(一)

简介: 蓝桥杯带刷题

A::::::::::::::::::小数第n位


题目描述

我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数。


如果我们把有限小数的末尾加上无限多个 0,它们就有了统一的形式。


本题的任务是:在上面的约定下,求整数除法小数点后的第 n 位开始的 3 位数。


输入描述

输入一行三个整数:a b n,用空格分开。a 是被除数,b 是除数,n是所求的小数后位置(0<a,b,n<109)


输出描述

输出一行 3 位数字,表示:a 除以 b,小数后第 n 位开始的 3 位数字。


输入输出样例

示例


输入

1 8 1

输出

125
#include <iostream>
using namespace std;
long long a,b,c;
int main(){
    cin>>a>>b>>c;
    a=a%b;      //求小数所以不影响,现在a<b,a*10/b就是第一个小数位 
  while(c-10>0){
    a=a*1e10;   //每次移动10位,一位乘以10,10位乘以1e10。
    a=a%b;
    c-=10;
  }
    for(int i=1;i<=c+2;i++){
        if(i>=c){
            cout<<a*10/b;   //这一位的小数值 
        } 
        a=a*10%b;           //剩下的 
    } 
    return 0;
}


B::::::::::::::::::卡片换位(BFS)


题目描述

你玩过华容道的游戏吗?


这是个类似的,但更简单的游戏。


看下面 3 x 2 的格子


+---+---+---+


| A | * | * |


+---+---+---+


| B | | * |


+---+---+---+


在其中放 5 张牌,其中 A 代表关羽,B 代表张飞,* 代表士兵。


还有个格子是空着的。


你可以把一张牌移动到相邻的空格中去(对角不算相邻)。


游戏的目标是:关羽和张飞交换位置,其它的牌随便在哪里都可以。


输入描述

输入两行 6 个字符表示当前的局面


输出描述

一个整数,表示最少多少步,才能把 A B 换位(其它牌位置随意)


输入输出样例

示例


输入

* A
**B

输出

17

运行限制

最大运行时间:1s

最大运行内存: 256M

#include <iostream>
#include <queue>
#include <map>
using namespace std;
string chushi[2];
int x,y,ax,ay,bx,by;
struct node{
  int x,y;
  int ax,ay;
  int bx,by;
  int ans;
  string lu[2];
};
node one;
queue<node> q;
int g[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool check(int x,int y){
  return x>=0&&x<2&&y>=0&&y<3;
}
map<string,bool> pan;
int main(){
  getline(cin,chushi[0]);
  getline(cin,chushi[1]);
  for(int i=0;i<2;i++){
    for(int j=0;j<3;j++){
      if(chushi[i][j]==' '){
        x=i,y=j;
      }
      if(chushi[i][j]=='A'){
        ax=i,ay=j;
      }
      if(chushi[i][j]=='B'){
        bx=i,by=j;
      }
    }
  }
  one.x=x,one.y=y,one.ax=ax,one.ay=ay,one.bx=bx,one.ans=0;
  one.by=by,one.lu[0]=chushi[0],one.lu[1]=chushi[1];
  string mm=chushi[0]+chushi[1];
  pan[mm]=1;
  q.push(one);
  while(!q.empty()){
    node f=q.front();
    q.pop();
    if(f.ax==bx && f.ay==by && f.bx==ax && f.by==ay){
      cout<<f.ans;
      break;
    }
    for(int i=0;i<4;i++){
      int tx=f.x+g[i][0];
      int ty=f.y+g[i][1];
      if(check(tx,ty)){
        string h[2];
        h[0]=f.lu[0];
        h[1]=f.lu[1];
        h[tx][ty]=' ';
        h[f.x][f.y]=f.lu[tx][ty];
        string mm=h[0]+h[1];
        if(!pan[mm]){
          pan[mm]=1;
          int xx,yy,axx,ayy,bxx,byy;
          for(int i=0;i<2;i++){
            for(int j=0;j<3;j++){
              if(h[i][j]==' '){
                xx=i,yy=j;
              }
              if(h[i][j]=='A'){
                axx=i,ayy=j;
              }
              if(h[i][j]=='B'){
                bxx=i,byy=j;
              }
            }
          }
          node two;
          two.x=xx,two.y=yy,two.ax=axx,two.ay=ayy,two.bx=bxx,two.ans=f.ans+1;
          two.by=byy,two.lu[0]=h[0],two.lu[1]=h[1];
          q.push(two);  
        }   
      }
    }
  }
  return 0;
}

 C::::::::::::::::::左移右移(双向链表,双指针)


问题描述

小蓝有一个长度为 N 的数组, 初始时从左到右依次是1,2,3,…N 。


之后小蓝对这个数组进行了 M 次操作, 每次操作可能是以下 2 种之一:


左移 x, 即把 x 移动到最左边。


右移 x, 即把 x 移动到最右边。


请你回答经过 M 次操作之后, 数组从左到右每个数是多少?


输入格式

第一行包含 2 个整数, N 和 M 。


以下 M 行每行一个操作, 其中 “L x "表示左移 x, R   x  "表示右移 x 。


输出格式

输出 NN 个数, 代表操作后的数组。


样例输入

5 3
L 3
L 2
R 1

样例输出

2 3 4 5 1

样例说明

样例中的数组变化如下:


[1,2,3,4,5]→[3,1,2,4,5]→[2,3,1,4,5]→[2,3,4,5,1]


评测用例规模与约定

对于 50% 的评测用例1≤N,M≤10000.


对于 100% 的评测用例, 1≤N,M≤200000,1≤x≤N.


运行限制

最大运行时间:3s

最大运行内存: 512M

双向链表:

#include <iostream>
#include <list>
using namespace std;
list<int> l; 
int n,m;
int main(){
  cin>>n>>m;
  for(int i=1;i<=n;i++){
    l.push_back(i);
  }
  for(int i=0;i<m;i++){
    char a;
    int v;
    cin>>a>>v;
    if(a=='L'){
      l.remove(v);
      l.push_front(v);
    }
    if(a=='R'){
      l.remove(v);
      l.push_back(v);
    }
  }
  for(list<int>::iterator it=l.begin();it!=l.end();it++){
    cout<<*it<<' ';
  }
  return 0;
}

能过50%


双指针:

#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
int a[200005];
struct node{
  long long zuobiao;
  int zhi;
  bool operator<(const node &rhs)const{
    return zuobiao<rhs.zuobiao;
  }
};
node b[1000000];
int main(){
  cin>>n>>m;
  long long l=-100;
  long long r=1e6;
  for(int i=1;i<=n;i++){
    b[i].zhi=i;
    b[i].zuobiao=i;
  }
  for(int i=0;i<m;i++){
    char a;
    int v;
    cin>>a>>v;
    if(a=='L'){
      b[v].zuobiao=l;
      l--;
    }else{
      b[v].zuobiao=r;
      r++;
    }
  }
  sort(b+1,b+n+1);
  for(int i=1;i<=n;i++){
    cout<<b[i].zhi<<' ';
  }
  return 0;
} 


相关文章
|
6月前
|
Java
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
2022蓝桥杯大赛软件类省赛Java大学B组真题 刷题统计
63 0
|
7月前
|
算法 安全 定位技术
【刷题】备战蓝桥杯 — dfs 算法
dfs算法在数据较小的情况下可以使用。 一定一定要确定好终止条件,避免栈溢出。 相应做好回溯,保证每次的遍历都是不一样的选择,避免少结果。 针对题目进行对应细节处理,有能力的话可以进行剪枝优化!!!
85 0
|
7月前
蓝桥杯备战刷题-滑动窗口
蓝桥杯备战刷题-滑动窗口
64 0
|
安全 算法
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(16)
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(16)
121 0
|
机器学习/深度学习 算法 定位技术
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(15)
【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(15)
113 0
|
算法 定位技术
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(7)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(7)
108 0
|
7月前
|
C++
第十三届蓝桥杯B组C++(试题C:刷题统计)
第十三届蓝桥杯B组C++(试题C:刷题统计)
53 0
|
算法
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
132 0
|
算法
【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11
【AcWing刷题】蓝桥杯专题突破-广度优先搜索-bfs(11
107 0
|
算法
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(10)
【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(10)
122 0