首页 > 其他分享 >牛客小白月赛99 C~E

牛客小白月赛99 C~E

时间:2024-10-13 11:48:37浏览次数:1  
标签:const && vis int 小白月赛 99 牛客 dx dy

牛客小白月赛99 C~E

C-迷宫

思路:其实能不能到达,只要看起点和终点是否能变成连通的。射线技能只能用一次,我们在起点能到的点\((x,y)\)去\(check:x,y,x-1,y-1,y+1\)是否在终点能到达的点的坐标中出现。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e3 + 10;
int n,m; 
char a[N][N];
int ds[N][N],de[N][N];
bool vis[N][N];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
bool in(int x,int y)
{
    return x >= 1 && x <= n && y >= 1 && y <= m;
}

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    cin>>n>>m;
    int sx,sy,ex,ey;
    for(int i = 1;i <= n; i++)
    {
        for(int j = 1;j <= m; j++)
        {
            cin>>a[i][j];
            if(a[i][j]=='S')
                sx = i,sy = j;
            if(a[i][j]=='E')
                ex = i,ey = j;
        }
    }


    queue<array<int,3>>q;
    memset(ds,127,sizeof(ds));
    memset(vis,false,sizeof(vis));
    ds[sx][sy] = 0;
    q.push({sx,sy,0});
    vis[sx][sy] = true;
    while(!q.empty())
    {
        auto [x,y,d] = q.front();
        q.pop();

        for(int i = 0;i < 4; i++)
        {
            int dx = x + dir[i][0];
            int dy = y + dir[i][1];
            if(in(dx,dy) && a[dx][dy] != '#' && !vis[dx][dy]){
                vis[dx][dy] = true;
                q.push({dx,dy,d+1});
                ds[dx][dy] = d + 1;
            }

        }

    }

    vector<array<int,2>>vs;
    for(int i = 1;i <= n; i++)
        for(int j = 1;j <= m; j++)if(ds[i][j] < (1<<30)){
                vs.push_back({i,j});
                // cout<<"i = "<<i<<" j = "<<j<<"\n";
        }
 
    memset(de,127,sizeof(de));
    memset(vis,false,sizeof(vis));
    de[ex][ey] = 0;
    q.push({ex,ey,0});
    vis[ex][ey] = true;
    while(!q.empty())
    {
        auto [x,y,d] = q.front();
        q.pop();

        for(int i = 0;i < 4; i++)
        {
            int dx = x + dir[i][0];
            int dy = y + dir[i][1];
            if(in(dx,dy) && a[dx][dy] != '#' && !vis[dx][dy]){
                vis[dx][dy] = true;
                q.push({dx,dy,d+1});
                de[dx][dy] = d + 1;
            }

        }

    }


    set<int>x,y;
    for(int i = 1;i <= n; i++)
        for(int j = 1;j <= m; j++)if(de[i][j] < (1<<30)){
                // cout<<"i = "<<i<<" j = "<<j<<"\n";

                x.insert(i);
                y.insert(j);
        }

    bool ok = false;
    for(auto [i,j] : vs){
        if(x.find(i) != x.end())
            ok = true;
        if(i-1>=1 && x.find(i-1) != x.end())
            ok = true;
        if(i+1<=n && x.find(i+1) != x.end())
            ok = true;
        if(y.find(j) != y.end())
            ok = true;
        if(j-1>=1 && y.find(j-1) != y.end())
            ok = true;
        if(j+1<=m && y.find(j+1) != y.end())
            ok = true;
    }


    cout<<(ok?"YES":"NO")<<"\n";


    return 0;
}

D-又是一年毕业季

思路:如果眨眼时间是质数,那么它的倍数就都不可以。如果眨眼时间是合数,那么它分解出的最小质数就是答案。

那么我们去预处理出质数,然后找到第一个没出现过的质数就是答案。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 5e6 + 10;

int n;

ll tot, p[N], pr[N];
bool vis[N];
void prime(int n)
{
    for (int i = 2; i <= n; i++)
    {
        if (!p[i])    p[i] = i, pr[++tot] = i; 
        for (int j = 1; j <= tot && pr[j] * i <= n; j++) {
            p[pr[j] * i] = pr[j];
            if(p[i] == pr[j])   break;
        }
    }
}


int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
  
    prime(N);
    int t; cin>>t;
    while(t--)
    {
        cin>>n;
        vector<int>v;
        for(int i = 1;i <= n; i++)
        {
            ll x; cin>>x;
            if(x > 5e6)continue;
            vis[x] = true;
            v.push_back(x);
        }

        for(int i = 1;i <= tot; i++)
        {
            if(!vis[pr[i]])
            {
                cout<<pr[i]<<"\n";
                break;
            }
        }
        for(auto x : v)
            vis[x] = false;
        

    }


    return 0;
}

E-多米诺骨牌

思路:毫无疑问是用第一个能压倒它的去压倒是最优的。我们记录当前最高的,能压就压,如果在这之前最高的都不能压倒的话,下一块就作为第一块再往后算。最后去前m大的就行了。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int f[N];

struct ty
{
    int h,x;
}a[N];

bool cmp(int x,int y)
{
    return x > y;
}

bool cmp1(ty x,ty y)
{
    return x.x < y.x;
}

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    int t; cin>>t;
    while(t--)
    {
        int n,m; cin>>n>>m;
        for(int i = 1;i <= n; i++)
            cin>>a[i].h;
        for(int i = 1;i <= n; i++)
            cin>>a[i].x;

        sort(a+1,a+1+n,cmp1);
        int t = 1,mx = a[1].h+a[1].x;
        vector<int>ans;
        for(int i = 2;i <= n; i++)
        {
            if(mx >= a[i].x){
                t++;
                mx = max(mx,a[i].h+a[i].x);
            }else{
                ans.push_back(t);
                t = 1;
                mx = a[i].h + a[i].x;
            }
        }

        ans.push_back(t);

        sort(ans.begin(),ans.end(),cmp);

        ll res = 0;
        for(int i = 0;i < min(m,(int)ans.size());i++)
            res += ans[i];
        cout<<res<<"\n";
    }


    return 0;
}

标签:const,&&,vis,int,小白月赛,99,牛客,dx,dy
From: https://www.cnblogs.com/nannandbk/p/18462098

相关文章

  • 每日OJ题_牛客_比那名居的桃子_滑动窗口/前缀和_C++_Java
    目录牛客_比那名居的桃子_滑动窗口/前缀和题目解析C++代码Java代码牛客_比那名居的桃子_滑动窗口/前缀和比那名居的桃子(nowcoder.com)描述:        小红有一天看到了一只桃子,由于桃子看上去就很好吃,小红很想把它吃掉。已知吃下桃子后,每天可以获得ai​的......
  • OPPO「玩游戏时间最久」手机OPPO K12 Plus 发布,双11到手价1799元起
    在智能手机市场日新月异的今天,OPPO再次以技术创新引领潮流,于10月12日正式发布了其K系列的最新力作——OPPOK12Plus。这款手机的问世,不仅标志着OPPO在续航、性能以及用户体验上的全面升阶,更是为消费者带来了一场关于科技与生活的美好邂逅。OPPOK12Plus将于10月12日15:30开启......
  • 题解:牛客小白月赛102(A - C)
    A序列中的排列题意:每次给你两个正整数\(n,k\),并给你一段长度为\(n\)的序列。(所有输入均为小于等于100的正整数)问:原序列中是否存在子序列,使得这个子序列是\(k\)的排列子序列:某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置(在前或在后)而形成的......
  • 2024牛客暑假多校第三场 - A. Bridging the Gap 2
    思路全在注释里了:#include<cstdio>#include<cmath>#include<algorithm>usingnamespacestd;constintN=5e5+5;intn,l,r,a[N];boolSolve(){ //打工次数:一个人能将其他人运过去的次数=一个人能过去以后能往返的次数 scanf("%d%d%d",&n,&l,&r); intmin_go=c......
  • 199号资源-源程序:(SCI论文+程序)具有部分观测损失的卡尔曼滤波-----已提供下载资源
    ......
  • 10.9日牛客CSP-S考试总结
    10.9日牛客CSP-S考试总结T1考场上大概看了一个多小时,想了一个部分分的做法,结果变界判断错误,导致puts("-1");的分也没拿到。T2大部分时间在做这题,想了一个搜索的做法,每次枚举从哪个时刻出发,取了一个较为合适的范围,又加了一个类似于spfa容错的优化。但是因为范围开小就会导致正......
  • 2023牛客OI赛前集训营-提高组(第三场) - 题解汇总
    空位与数(game)贪心即可,因为正正得正,负负也得正,所以将两个数组分别按照正负性分开,然后让正数里面大的配上大的,负数里面绝对值大的配上绝对值大的,这样可以让正积总和尽量大。剩下不足的(必须要一正一负相乘的)让绝对值大的配绝对值小的,这样可以让负积总和尽量小。#include<cstdio>#i......
  • 刷c语言练习题5(牛客网)
    1、若有定义inta[8];,则以下表达式中不能代表数组元素a[1]的地址的是()A、&a[0]+1B、&a[1]C、&a[0]++D、a+1答案:C解析:C选项中&a[0]是一个地址常量,对地址常量的赋值操作是不合法的,错误。2、 以下函数值的类型是:fun(floatx){floaty;y=3*x-4;returny;}A、i......
  • ThreeJS入门(099):THREE.ArcCurve 知识详解,示例代码
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为国内GIS领域高级前端工程师,CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,webgl,ThreeJS,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第100篇入门文章......
  • 牛客小白月赛101 A~E
    牛客小白月赛101A~EA-tb的区间问题题意:tb给了fc一个长度为n的数组A,fc对A进行k次如下操作:删除数组第一个元素或者删除数组最后一个元素。求最后得到的数组和的最大值。思路:最后删除的是某一组前后缀,一一去枚举可行的区间即可。//AConemoretimes//nndbk......