Codeforces Round 994 (Div. 2)(A-D)

上链接:Dashboard - Codeforces Round 994 (Div. 2) - Codeforces

A. MEX Destruction

思路

显然如果全是0则输出0,如果非零的子数组只有一块输出1,其余的输出2

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;

void solve(){
    int n;
    cin>>n;
    vi a(n+10);
    bool flag=false;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(a[i]) flag=true;
    }
    if(flag==false){
        cout<<"0\n";return;
    }

    int ct=0;
    bool f=true;
    for(int i=1;i<=n;i++){
        if(a[i]){
            if(f==true){
                f=false;
                ct++;
            }
        } 
        if(a[i]==0){
            f=true;
        }
    }
    if(ct<=1){
        cout<<"1\n";return;
    }
    cout<<2<<"\n";
}
signed main() {
    vcoistnt
    int _=1;
    cin>>_;
    while(_--) solve();
    return 0;
}

B. pspspsps

思路

根据题意可以发现左端是's'与右端是'p'对结果没有影响,其余的情况的话如果同时出现了s和p那么就必然是不能够成立的

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;

void solve(){
    int n;
    cin>>n;
    string s;
    cin>>s;
    s=" "+s;
    int t=1;
    if(s[1]=='s') t++;
    if(s[n]=='p') n--;
    bool fs=false,fp=false;
    for(int i=t;i<=n;i++){
        if(s[i]=='s') fs=true;
        if(s[i]=='p') fp=true;
    }
    if(fs&&fp){
        cout<<"NO\n";
    }else{
        cout<<"YES\n";
    }
}
signed main() {
    vcoistnt
    int _=1;
    cin>>_;
    while(_--) solve();
    return 0;
}

C. MEX Cycle

思路

构造题,提供一种构造方法

先不管题目中(此外,龙 x 和 y 彼此是朋友)这个条件对a数组进行构造,

偶数:101010...10 奇数:101010...102

然后将(此外,龙 xx 和 yy 彼此是朋友)这个条件加进去,如果ax!=ay那么显然是不用改变的,否则又要分为奇数和偶数的情况

奇数:把x的后面插入一个2,把最后的2删掉即可

偶数:这里又分为两种情况,当y==n就把第一个1删掉并且再末尾加个2就行了,否则将x后面插入个2再对原来的a数组进行调整

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;

const int N=2e5+10;
const int INF=0x3f3f3f3f3f3f3f3f;
const int inf=INT_MIN;
const int mod=998244353;
const int base=283;

void solve(){
    int n,x,y;
    cin>>n>>x>>y;
    vi a(n+10);
    for(int i=1;i<=n;i++){
        a[i]=i%2;
    }
    if(n%2) a[n]=2;

    if(a[x]==a[y]){
        if(a[n]==2){
            for(int i=1;i<n;i++){
                if(i==x) cout<<a[i]<<" 2 ";
                else{
                    cout<<a[i]<<" ";
                }
            }cout<<"\n";
            return;
        }else{
            if(y!=n){
                for(int i=1;i<n-1;i++){
                    if(i==x){
                        cout<<a[i]<<" 2 ";
                    }else
                    cout<<a[i]<<" ";
                }
                cout<<"2";
                cout<<"\n";
                return;
            }else{
                for(int i=2;i<=n;i++){
                    cout<<a[i]<<" ";
                }
                cout<<"2\n";return;
            }
        }
    }
    for(int i=1;i<=n;i++){
        cout<<a[i]<<" \n"[i==n];
    }
}
signed main() {
    vcoistnt
    int _=1;
    cin>>_;
    while(_--) solve();
    return 0;
}

D. Shift + Esc

思路

dp,如果去掉移动前执行的操作的话,那么这个题就变成了普通的状态转移题,那么考虑在此基础上新增状态达到此题的目的

令 dpijk 表示到达(i,j)时第i行进行了k次操作所能到达的最小代价,(i,j)状态可以由(i-1,j)和(i,j-1)转移过来的,

(i,j-1):显然是由 dpij-1k+ai(j+k-1)%m+1 转移过来的;

(i-1,j):是由fi-1j+ai(j+k-1)%m+1 转移而来,f(i,j)表示到达(i,j)位置时的最小代价

那么答案即fnm

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

#define vcoistnt ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); 
#define int long long
#define ull unsigned long long
#define bit __builtin_popcountll
#define lowbit(x) ((x)&-(x))
#define vi vector<int>
#define vb vector<bool>
typedef pair<int,int> pll;

const int N=2e5+10;
const int inf=1e18;
const int mod=998244353;

void solve(){
    int n,m,w;
    cin>>n>>m>>w;
    vector<vi> a(n+10,vi(m+10));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    
    vector< vector< vector<int> > > dp(n+10,vector<vector<int>>(m+10,vector<int>(m+10,inf)));
    vector<vi> f(n+10,vi(m+10,inf));

    f[0][1]=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int k=0;k<m;k++){
                dp[i][j][k]=min(f[i-1][j]+k*w+a[i][(j+k-1)%m+1],dp[i][j-1][k]+a[i][(j+k-1)%m+1]);

                f[i][j]=min(f[i][j],dp[i][j][k]);
            }
        }
    }
    cout<<f[n][m]<<"\n";
}
signed main() {
    vcoistnt
    int _=1;
    cin>>_;
    while(_--) solve();
    return 0;
}
相关推荐
KJ_BioMed2 小时前
从PDB到高亲和力分子:De novo生成式计算化学Pipeline剖析
算法·生物医药·生物科研·科研干货·化合物设计
一个王同学3 小时前
从零到一 | CV转多模态大模型 | week17 | LLM 推理优化 & vLLM 详解
人工智能·深度学习·算法·机器学习·计算机视觉·vllm
旖-旎4 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划
变量未定义~4 小时前
单调栈+倍增思想 皇家守卫【算法赛】、单调队列 附近最小
算法
QN1幻化引擎4 小时前
给 AI 做一次「意识体检」——基于 QN1 幻化引擎的灵鉴意识识别框架与 DalinX V5 实测
大数据·数据结构·人工智能·算法·架构
拂拉氏5 小时前
【知识讲解】 AVL树从基本成员的介绍到核心接口的实现(插入、判断、删除等等)
数据结构·算法·avl树
可靠的仙人掌5 小时前
SAC(Soft Actor-Critic)算法底座
开发语言·算法·php
c238565 小时前
《动态规划:从“傻傻穷举”到“过目不忘”的修仙之路》
c++·算法·动态规划
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练:【二分答案】案例2:木材加工
c++·二分答案·csp·高频考点·信奥赛·木材加工
海石7 小时前
单调栈复健,顺便,牺牲一下吧,空间复杂度!一切献给AC
算法·leetcode