牛客小小白月赛41

题号标题已通过代码通过率我的状态
A小红的签到题点击查看1721/2030 通过
B小红的ABC点击查看1077/2849 通过
C小红的口罩点击查看777/2973 通过
D小红的数组点击查看466/2559 通过
E小红的rpg游戏点击查看424/2279 通过
F小红的375点击查看216/1221 通过

目录

小红的签到题

 题目:​

思路分析:

代码实现:

小红的ABC

题目:​

思路分析:

代码实现:

小红的口罩

题目:​

思路分析:

代码实现:

小红的数组

题目:​

思路分析:

代码实现:

小红的rpg游戏

题目:

思路分析:

代码实现:

小红的375

题目:

思路分析:

代码实现:


​​​​​​​

小红的签到题

 题目:

思路分析:

代码实现:

#include<iostream>
using namespace std;
int main(){
    int a,b,c;
    cin>>a>>b>>c;
    cout<<c/a;
}

小红的ABC

题目:

思路分析:

数据小

直接从小到大遍历就行

代码实现:

/*
*@Author:   GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
 *                                                     __----~~~~~~~~~~~------___
 *                                    .  .   ~~//====......          __--~ ~~
 *                    -.            \_|//     |||\\  ~~~~~~::::... /~
 *                 ___-==_       _-~o~  \/    |||  \\            _/~~-
 *         __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *     _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *   .~       .~       |   \\ -_    /  /-   /   ||      \   /
 *  /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 *  |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *           '         ~-|      /|    |-~\~~       __--~~
 *                       |-~~-_/ |    |   ~\_   _-~            /\
 *                            /  \     \__   \/~                \__
 *                        _--~ _/ | .-~~____--~-/                  ~~==.
 *                       ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                  -_     ~\      ~~---l__i__i__i--~~_/
 *                                  _-~-__   ~)  \--______________--~~
 *                                //.-~~~-~_--~- |-------~~~~~~~~
 *                                       //.-~~~--\
 *                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 *
 *                               神兽保佑            永无BUG
 */




int main(){
    string s;
    cin>>s;
    int n=s.size();
//    cout<<n<<endl;
    int f=0;
    for(int i=1;i<n;i++){
//        cout<<i<<":"<<endl;
        for(int j=0;j<=n-i;j++){
            int l=j;
            int r=l+i;
//            cout<<l<<" "<<r<<endl;
            int f1=1;
            while(l<r){
                if(s[l]!=s[r]){
                    f1=0;
                    break;
                }
                l++;
                r--;
            }
            if(f1) {
                cout<<i+1<<endl;
                f=1;
                return 0;
            }
        }
    }
    cout<<-1<<endl;
    return 0;
}

/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/

小红的口罩

题目:

思路分析:

一个小根堆的运用 

代码实现:

const int MAX=1e5+10;

struct cmp{
    bool operator()(int &a,int &b){
        return a>b;
    }
};
priority_queue<int,vector<int>,cmp>q;
int  main(){
    int n;
    ll k;
    cin>>n>>k;
    for(int i=0;i<n;i++){
        int  x;
        cin>>x;
        q.push(x);
    }
    int ans=0;
    while (!q.empty()&&k) {
        int now=q.top();
        q.pop();
        if(k<now){
            break;
        }
        ans++;
        k-=now;
        q.push(now<<1);
    }
    cout<<ans;
}

小红的数组

题目:

思路分析:

先对数组就行sort排序

然后遍历数组 当前元素是a[i] 

那么我们可以用二分

找到a[i]*l<k 的最后一个元素下标为l

找到a[i]*r>k的第一个元素下标为r

那么r-l是等于k的个数

l之前的是小于k的

r之后的是大于k的 

代码实现:

ll a[300005];
int n;
ll k;
ll ans1,ans2,ans3,v1,v2;





int main()
{
    n = read();
    k = read();
    for(int i = 1;i<=n;++i)
        a[i] = read();
    sort(a+1,a+1+n);
    for(int i = 1;i<=n;++i)
    {
        int l = lower_bound(a + 1 + i,a + 1 + n,1.0 * k / a[i]) - a;
        int r = upper_bound(a + 1 + i,a + 1 + n,1.0 * k / a[i]) - a;
        ans1+=l-i-1;
        ans3+=n-r+1;
        ans2+=r-l;
    }
    printf("%lld %lld %lld",ans3,ans2,ans1);
    return 0;
}

小红的rpg游戏

题目:

思路分析:

最开始想的是直接暴力dfs+剪枝可是没过 

然后看题解是状压枚举每个怪物的点是否经过 如果经过就把他和'.'并为一类 否则 和*为一类

然后bfs+剪枝就行

代码实现:

dfs

#include<iostream>
using namespace std;
int n,m,h;
const int MAX=55;
int vis[MAX];
char c[MAX][MAX];

int ans=0x3f3f3f3f;
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y,int hp,int step){
    if(step>ans||x<1||x>n||y<1||y>m||vis[x][y]){
        return;
    }
    if(x==n&&y==m&&ans>step){
        ans=step;
        return;
    }
    vis[x][y]=1;
    for(int i=0;i<4;i++){
        int x1=x+d[i][0];
        int y1=y+d[i][1];
        if(c[x1][y1]=='.'){
            dfs(x1,y1,hp,step+1);
        }
        else if(c[x1][y1]=='*'){
            continue;
        }
        else if(c[x1][y1]>='0'&&c[x1][y1]<='9'){
            dfs(x1,y1,hp-(c[x1][y1]-'0'),step+1);
        }
    }
    vis[x][y]=0;
}
int main(){
    cin>>n>>m>>h;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>c[i][j];
        }
    }
    dfs(1,1,h,0);
    if(ans>=0x3f3f3f3f){
        cout<<-1;
    }
    else cout<<ans;
}

bfs+状压

#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
typedef long long  ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
using namespace std;
int n,m,h;
const int MAX=55;

char c[MAX][MAX];
struct node{
    int x,y;
    int h;
};
node b[15];
int vis[MAX][MAX];
int ans=0x3f3f3f3f;
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};

int main(){
    cin>>n>>m>>h;
    int ans=0;
    int aans=0x3f3f3f3f;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>c[i][j];
            if(c[i][j]>='0'&&c[i][j]<='9'){
                b[ans++]={i,j,c[i][j]-'0'};
            }
        }
    }
    for(int i=0;i<(1<<ans);i++){
        int vis[MAX][MAX]={0};
        int step[MAX][MAX]={0};
        int hp=h;
        for(int j=0;j<ans;j++){
            if(i&(1<<j)){
                vis[b[j].x][b[j].y]=1;
                hp-=b[j].h;
            }
            else
                vis[b[j].x][b[j].y]=0;
        }
        if(hp<=0)
            continue;
        mms(step,-1);
        step[1][1]=0;
        queue<pair<int,int>>q;
        q.push({1,1});
        while (!q.empty()) {
            if(step[n][m]!=-1) break;
            int x=q.front().first;
            int y=q.front().second;
            q.pop();
            for(int i=0;i<4;i++){
                int xx=x+d[i][0];
                int yy=y+d[i][1];
                if(xx==n&&yy==m){
                    step[xx][yy]=step[x][y]+1;
                    break;
                }
                if((c[xx][yy]=='.'||vis[xx][yy]==1)&&step[xx][yy]==-1){
                    q.push({xx,yy});
                    step[xx][yy]=step[x][y]+1;
                }
            }
        }
        if(step[n][m]!=-1){
            aans=min(aans,step[n][m]);
        }
    }
    if(aans>=0x3f3f3f3f){
        cout<<-1;
    }
    else cout<<aans;
        
}

小红的375

题目:

思路分析:

一道构造题目

375=125*3

那么这个数只需要同时满足 是 3 和125 的倍数就行

3 的倍数简单

125的倍数的话

只需要末尾的三位数字是125的倍数 同时000也行!

利用哈希计数

代码实现:

#include<iostream>
#include<queue>
#define mms(x, y) memset(x, y, sizeof x)
typedef  long long ll;
using namespace std;
int has[10];
string bs[8] = {"000","500","750","250","625","375","875","125"};
ll sum;
int main()
{
    char c;
    while(cin>>c)
        has[c-'0']++,sum+=c-'0';
    if(sum%3){
        cout<<-1<<endl;
        return 0;
    }
    for(int i = 0;i<8;++i)
    {
        int j = 0;
        for(j = 0;j<3;++j)
            has[bs[i][j]-'0']--;
        for(j = 0;j<=9;++j)
            if(has[j]<0)    break;
        if(j==10)
        {
            for(j = 9;j>=0;--j)
            {
                while(has[j]--)
                    cout<<j;
            }
            for(j = 0;j<3;++j)
                cout<<bs[i][j];
            return 0;
        }
        for(j = 0;j<3;++j)
            has[bs[i][j]-'0']++;
    }
    cout<<-1;
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭晋龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值