首页 > 其他分享 >2024 黑龙江省赛 BDIJK

2024 黑龙江省赛 BDIJK

时间:2024-10-29 15:11:49浏览次数:6  
标签:const cout 黑龙江省 int ll long st 2024 BDIJK

The 19th Heilongjiang Provincial Collegiate Programming Contest BDIJK

B. String

思路:连续的3个可以删掉,类似括号匹配,用栈模拟即可。

// 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 main()
{
   ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    
    string s; cin>>s;
    
    if(s.size() < 3)
    {
        cout<<s<<"\n";
        return 0;
    }

    stack<char>st;

    int i = 0;
    while(i < s.size())
    {
        if(st.size() < 2)
        {
            st.push(s[i]);
            i++;
            continue;
        }

        char x = st.top(); st.pop();
        char y = st.top(); st.pop();
        if(x == y && x == s[i])
        {
            i++;
        }else{
            st.push(y);
            st.push(x);
            st.push(s[i]);
            i++;
        }
        
    }

    if(st.size() == 0)
    {
        cout<<"NAN\n";
        return 0;
    }
    string ans = "";
    while(!st.empty())
    {
        ans += st.top();
        st.pop();
    }
    for(int i = ans.size()-1;i >= 0; i--)
        cout<<ans[i];
    
    return 0;
}

D. Card Game

思路:因为只有2个同时是攻击会产生效果,那么其实只用考虑两个都是攻击的部分就行了,用大的打对面小的。

// 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;
ll a[N],b[N];

bool cmp(ll a,ll b)
{
    return a > b;
}

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

        sort(a+1,a+1+n,cmp);
        sort(b+1,b+1+n);
        int l = 1,r = n;
        while(b[l] == -1)l++;

        //先大的打它小的
        bool ok = true;
        for(int i = 1;i <= n; i++)
        {
            if(a[i] == -1 || l > r){
                ok = false;
                break;
            }

            // cout<<"a[i] = "<<a[i]<<" b[l] = "<<b[l]<<"\n";
            hpa -= b[l];
            hpb -= a[i];
            if(hpa <= 0)
            {
                ok = false;
                break;
            }
            else if(hpb <= 0)
            {
                break;
            }
            l++;
            // cout<<"hpa = "<<hpa<<" hpb = "<<hpb<<"\n";
        }
        if(!ok)
            cout<<"no\n";
        else{
            if(hpa > 0 && hpb > 0)
                cout<<"no\n";
            else cout<<"yes\n";
        }

    }

    return 0;
}

I. This is an easy problem

思路:签到,直接算就行了

// 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 main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    ll n; cin>>n;
    int cnt = 0;
    while(n)
    {   
        cnt += (n&1);
        n>>=1;
    }

    cout<<cnt<<"\n";

    return 0;
}

J. Trade

思路:因为只能向下和向右走,也就是说(i+1,j)和(i,j+1)只能由(i,j)转移过来。很容易想到dp。

我们定义\(dp[i][j][0/1]\)为到(i,j)位置卖出(1)和没有卖出(0)的最大收益。最后把收益是非负数的位置赋成'.',反之设为'#'。然后跑一个bfs即可。

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


ll a[N][N],b[N][N],dp[N][N][2];

bool vis[N][N];
ll dist[N][N];
int dir[2][2] = {{1,0},{0,1}};
int n,m;

char c[N][N];

bool in(int x,int y)
{
    return x >= 1 && x <= n && y >=1 && y <= m;
}

void bfs(int sx,int sy)
{
    memset(dist,127,sizeof(dist));
    dist[sx][sy] = b[sx][sy];
    queue<array<int,2>>q;
    q.push({sx,sy});

    while(!q.empty())
    {
        auto [x,y] = q.front();
        q.pop();

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



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

    for(int i = 1;i <= n; i++)
        for(int j = 1;j <= m; j++)
            cin>>b[i][j];    


    memset(dp,128,sizeof(dp));
    dp[1][1][0] = dp[1][1][1] = -a[1][1]-b[1][1];
    for(int i = 1;i <= n; i++)
    {
        for(int j = 1;j <= m; j++)
        {
            dp[i+1][j][0] = max(dp[i+1][j][0],dp[i][j][0]-b[i+1][j]);
            dp[i+1][j][1] = max(dp[i+1][j][1],dp[i][j][0]+a[i+1][j]-b[i+1][j]);

            dp[i][j+1][0] = max(dp[i][j+1][0],dp[i][j][0]-b[i][j+1]);
            dp[i][j+1][1] = max(dp[i][j+1][1],dp[i][j][0]+a[i][j+1]-b[i][j+1]);
        }
    }



    for(int i = 1;i <= n; i++)
    {
        for(int j = 1;j <= m; j++)
        {

            if(dp[i][j][1] >= 0)c[i][j] = '.';
            else c[i][j] = '#';
        }
    }
    c[1][1] = '.';

    bfs(1,1);


    bool ok = false;
    for(int i = 1;i <= n; i++)
    {
        if(dist[i][m] < (1<<30))
            ok = true;
    }



    for(int i = 1;i <= m; i++)
    {
        if(dist[n][i] < (1<<30))
            ok = true;
    }

    if(ok)cout<<"YES\n";
    else cout<<"NO\n";
    return 0;
        
}

K. Puzzle

思路:只有4个数,填3种符号,直接暴力2个dfs。注意因为有优先级问题,注意分类讨论。

// 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;
ll A,B,C,D;
ll a,b,c,d;
ll arr[10];
int s[10];
bool vis[N];


int op[3] = {0,1,2};//+,-,*
int t[10];
set<ll>ans;
void dfs(int step)
{
    if(step > 3){

        // cout<<t[1]<<" "<<t[2]<<" "<<t[3]<<"\n";
        ll res = 0;
        if(t[1] != 2 && t[2] != 2 && t[3] != 2)
        {
            if(t[1] == 0)
                res = a + b;
            else if(t[1] == 1)
                res = a - b;

            if(t[2] == 0)
                res = res + c;
            else if(t[2] == 1)
                res = res - c;
            
            if(t[3] == 0)
                res = res + d;
            else if(t[3] == 1)
                res = res - d;
        }else{
            if(t[1] == 2 && t[2] == 2 && t[3] == 2)
            {
                res = a*b*c*d;
            }
            else if(t[1] == 2 && t[2] == 2)
            {
                res = a*b*c;
                if(t[3] == 0)
                    res = res + d;
                else if(t[3] == 1)
                    res = res - d;
            }
            else if(t[1] == 2 && t[3] == 2)
            {
                res = a*b;
                if(t[2] == 0)
                    res = res + c*d;
                else if(t[2] == 1)
                    res = res - c*d;
            }
            else if(t[2] == 2 && t[3] == 2)
            {
                if(t[1] == 0)
                    res = a + b*c*d;
                else if(t[1] == 1)
                    res = a - b*c*d;
            }
            else if(t[1] == 2)
            {
                res = a*b;
                if(t[2] == 0)
                    res = res + c;
                else if(t[2] == 1)
                    res = res - c;
                
                if(t[3] == 0)
                    res = res + d;
                else if(t[3] == 1)
                    res = res - d;
            }
            else if(t[2] == 2)
            {
                if(t[1] == 0)
                    res = a + b*c;
                else if(t[1] == 1)
                    res = a - b*c;
                if(t[3] == 0)
                    res = res + d;
                else if(t[3] == 1)
                    res = res - d;
            }
            else if(t[3] == 2)
            {
                if(t[1] == 0)
                    res = a + b;
                else if(t[1] == 1)
                    res = a - b;

                if(t[2] == 0)
                    res = res + c*d;
                else if(t[2] == 1)
                    res = res - c*d;
            }
        }
        
        ans.insert(res);
        // cout<<res<<"\n";
        return;
    }

    for(int i = 0;i < 3; i++)
    {
        t[step] = i;
        dfs(step+1);
    }
}
void dfs1(int k)
{
    if(k > 4)
    {
        a = s[1],b = s[2],c = s[3],d = s[4];
        dfs(1);
        return;
    }

    for(int i = 1;i <= 4; i++)
    {
        if(!vis[i])
        {
            vis[i] = true;
            s[k] = arr[i];
            dfs1(k+1);
            vis[i] = false;
        }
    }


}

int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
  
    cin>>A>>B>>C>>D;
    arr[1] = A,arr[2] = B,arr[3] = C,arr[4] = D;
    dfs1(1);
    cout<<ans.size()<<"\n";
    return 0;
}

标签:const,cout,黑龙江省,int,ll,long,st,2024,BDIJK
From: https://www.cnblogs.com/nannandbk/p/18513322

相关文章

  • P11234 [CSP-S 2024] 擂台游戏
    看看了看今年的csps,前三题一眼就秒了,这最后一题想了挺久,还写了快两个小时,要是在正式赛场上估计是要暴毙了,不过好在我已经退役了,希望参赛的选手能有好的发挥题目大意太长了,不写了题解考虑每次加入一个人,然后分析变化的答案经过一些分析,可以发现一些性质1.对于完全没有确定能......
  • CSP-J 2024-T1扑克牌
    方法一:使用二维字符数组存储,利用字符串函数比较去重#include<bits/stdc++.h>usingnamespacestd;intn;chara[62][3];//注意此处第二维数组需要开3否则会出现未知错误intcnt;//用于统计去重后的个数intmain(){ //cout<<strcmp("dd","dd")<<""<<strcmp("......
  • NOIP 模拟赛:2024-10-23
    T1:游戏有\(n\)个关卡,编号\(1\simn\),编号\(i\)的关卡的难度是\(p_i\),其中\(p_1,p_2,\dots,p_n\)是\(1,2,\dots,n\)的一个排列。每一个关卡还定义了一个重要度\(d_i\),它的值等于其中前\(i\)个关卡中的难度最小值,即\(d_i=\min_{j=1}^ip_j\)。玩家需通关每个关......
  • 2024.10.29 人工智能技术学 第六课时
    复习——任务导向RTRI/问题导向RPGS通过引用/po原文,并引用用于回答问题的文章段落。格式:({“引文”:。。。})“内心独白法”——辅助课业可以将不想让学生看到的内容,隐藏地放到一个结构化的格式里,然后再把输出展示给学生,解析一下这段输出。只展示能给学生看到的那部分。评估反......
  • 2024/10/29人工智能课
    一:给大语言模型发阅读材料如果你手边现成有原文,而且长度合适,建议自带原文去找大语言模型①SYSTEMUsetheprovidedarticlesdelimitedbytriplequotestoanswerquestions.Iftheanswercannotbefoundinthearticles,write"Icouldnotfindananswer."请使......
  • 2024年10月28日Github流行趋势
    项目名称:Skyvern-AI/skyvern项目维护者:@ykeremy@wintonzheng@LawyZheng@msalihaltun@suchintan项目介绍:使用LLMs和计算机视觉实现基于浏览器的工作流程自动化。项目star数:8,730项目fork数:566项目名称:anthropics/courses项目维护者:@Colt@alexalbertt@rainl......
  • ChatGPT国内中文版镜像网站整理合集(2024/10/29)
     一、GPT中文镜像站① yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画② chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT③ AIChat 支持GPT3.5/4,4o以及MJ绘画1.什么是镜像站镜像站(MirrorSite)是指通过复制原始网站内容和结构,创建的备用网站。其主要目......
  • Animate(AN2024)下载
    目录软件简介获取安装包一、AdobeAN软件常用快捷键1.文件操作2.视图操作3.编辑与修改二、AdobeAN软件功能介绍1.绘图与图形编辑2.动画制作3.交互式内容制作三、AdobeAN软件操作指南1.创建项目2.设计图形与动画3.导出与发布软件简介AdobeAnimate......
  • CSP2024游记
    CSP2024游记J组T1,T2,T3一个小时做完,T4两个半小时不会做。S组T1最开始以为是一个线段树,写完了才发现一个循环搞定,浪费一个小时。T2发现算出超速区间后就变成了一个每个区间选一个点的贪心,一个小时做完。T4看了发现不能做,开始做T3。T3先是想了一个非常接近正解的错解,本来改......
  • 2024前端面试训练计划-高频题-JavaScript基础篇
    具体内容结构(可作为回答思路)为:简略回答,详细回答1、JavaScript有几种数据类型?简略回答JavaScript共有八种数据类型,分别是Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。详细回答具体来说,分为两种类型:原始数据类型和引用数据类型:原始数据类型......