AC修炼计划(AtCoder Regular Contest 164)

news/2024/7/24 4:42:49 标签: 算法, c++, 动态规划

传送门:AtCoder Regular Contest 164 - AtCoder

A.签到题,在此不做赘述

B - Switching Travel

这题本来该是秒的,但是因为没有考虑清楚环的问题而被卡半天,其实我们不难发现,要想使题目存在节点,就得让该节点出现一条环同时,而且环最后的头和尾颜色还必须得相等。直接dfs跑环加暴力枚举即可。

// #pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const int MX=0x3f3f3f3f3f3f3f3f; 
int n,m;
int id;
int ue[1000005];
void icealsoheat(){
    cin>>n>>m;
    vector<vector<int>>ve(n+5);
    for(int i=1;i<=m;i++){
        int l,r;
        cin>>l>>r;
        ve[l].push_back(r);
        ve[r].push_back(l);
    }
    vector<int>c(n+5,0);
    for(int i=1;i<=n;i++)cin>>ue[i];
    bool f=0;
    id=0;
    auto dfs=[&](auto self,int x,int fa)->void{
        for(auto i:ve[x]){
            if(c[i]||ue[i]==ue[x])continue;
            c[i]=id;
            self(self,i,x);
        }
    };
    for(int i=1;i<=n;i++){
        if(c[i]==0){
            id++;
            c[i]=id;
            dfs(dfs,i,-1);
        }
        for(auto j:ve[i]){
            if(ue[i]==ue[j]&&c[i]==c[j])f=1;
        }        
        if(f)break;

    }
    // for(int i=1;i<=n;i++)cout<<c[i]<<"+++\n";
    // cout<<c[4]<<"----\n";
    if(f)puts("Yes");
    else puts("No");

}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _;
    _=1;
    // cin>>_;
    while(_--){
        icealsoheat();
    }
}

C - Reversible Card Game

通过贪心的思想,双方若想都取最优,爱丽丝尽可能把差值大的值的从大的翻到小的,而鲍勃尽可能的在爱丽丝得手之前把没翻的牌(差值尽可能大的)拿走。然后,当正面大的牌都拿完的时候,鲍勃只需跟着爱丽丝拿,爱丽丝翻一张(把大的值翻上来),鲍勃就拿一张。

// #pragma GCC optimize(3)  //O2优化开启
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
const int MX=0x3f3f3f3f3f3f3f3f; 
int n,m;
int a[1000005];
int b[1000005];
bool c[1000005];
struct we{
    int x;
    int cha;
    bool operator <(const we &k)const{
        return k.cha>cha;
    }
};
bool cmp(we ae,we be){
    return ae.cha<be.cha;
}
void icealsoheat(){
    cin>>n;
    priority_queue<we>q;
    vector<we>ve;
    priority_queue<we>qq;
    int ans=0;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>b[i];
        ans+=min(a[i],b[i]);
        if(a[i]>b[i]){
            q.push({i,abs(a[i]-b[i])});
        }
        else{
            ve.push_back({i,abs(a[i]-b[i])});
        }
    }
    int op=0;
    while(q.size()){
        we now=q.top();
        q.pop();
        if(op==0){
            op^=1;
            ve.push_back({now});
        }
        if(!q.size())break;
        now=q.top();
        q.pop();
        if(op==1){
            op^=1;
            ans+=now.cha;
        }
    }
    // cout<<ans<<"+++\n";
    sort(ve.begin(),ve.end(),cmp);
    for(auto [i,j]:ve){
        if(op==0){
            ans+=j;
        }
        else op^=1;
    }

    cout<<ans;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _;
    _=1;
    // cin>>_;
    while(_--){
        icealsoheat();
    }
}

D - 1D Coulomb

一道很经典很妙的dp。

我们需要用dp迭代一下类似括号匹配的一样的结构。让+与-相互抵消。

dp[i][j]为值的和,i代表了前i个字母,j代表着+与-的差值状态。(n为+与-相等,0到n-1是-的较多,n+1到2*n是+较多)。hh[i][j]为当前方案的次数。

代码如下:

//#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int,int> PII;
const int N=998244353;
int n,m,k;
void icealsoheat(){
    cin>>n;
    string s;
    cin>>s;
    s=' '+s;
    vector<vector<int>>dp(2*n+5,vector<int>(2*n+5,0));
    vector<vector<int>>hh(2*n+5,vector<int>(2*n+5,0));
    hh[0][n]=1;
    for(int i=1;i<=2*n;i++){
        for(int j=0;j<=2*n;j++){
            if(s[i]=='+'||s[i]=='?'){
                if(j>0){
                    dp[i][j]=(dp[i][j]+dp[i-1][j-1])%N;
                    hh[i][j]=(hh[i][j]+hh[i-1][j-1])%N;
                }
                if(j<=n&&j>0){
                    int v=n-j;
                    v=v*2+1;
                    dp[i][j]=(dp[i][j]+hh[i-1][j-1]*v%N)%N;
                }
            }
            if(s[i]=='-'||s[i]=='?'){
                if(j<2*n){
                    dp[i][j]=(dp[i][j]+dp[i-1][j+1])%N;
                    hh[i][j]=(hh[i][j]+hh[i-1][j+1])%N;
                }
                if(j>=n&&j<2*n){
                    int v=j-n;
                    v=v*2+1;
                    dp[i][j]=(dp[i][j]+hh[i-1][j+1]*v%N)%N;                    
                }
            }
        }
    }
    cout<<dp[2*n][n];


}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie();
    cout.tie();
    int _;
    _=1;
    // cin>>_;
    while(_--){
        icealsoheat();
    }
}


http://www.niftyadmin.cn/n/5133716.html

相关文章

当『后设学习』碰上『工程学思维』

只要我成为一个废物&#xff0c;就没人能够利用我&#xff01; 雷猴啊&#xff0c;我是一只临期程序猿。打过几年工&#xff0c;写过几行代码。但今天我不想聊代码&#xff0c;我们聊聊学习这件事。 技术年年更新&#xff0c;尤其是前端框架&#xff0c;很多时候觉得学习速度都…

【PyQt学习篇 · ④】:QWidget - 尺寸操作

文章目录 QWidget简介QWidget大小位置操作案例一案例二 QWidget尺寸限定操作案例 内容边距案例 QWidget简介 在PyQt中&#xff0c;QWidget是一个基本的用户界面类&#xff0c;用于创建可见的窗口组件。QWidget可以包含多种类型的子组件&#xff0c;如QPushButton、QLabel、QLi…

Linux mv命令:移动文件或改名

mv 命令&#xff08;move 的缩写&#xff09;&#xff0c;既可以在不同的目录之间移动文件或目录&#xff0c;也可以对文件和目录进行重命名。该命令的基本格式如下&#xff1a; [rootlocalhost ~]# mv 【选项】 源文件 目标文件 -f&#xff1a;强制覆盖&#xff0c;如果目标文…

行为型模式-行为型模式

在模板模式中&#xff0c;一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现&#xff0c;但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 意图&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类…

【已解决】VSCode运行C#控制台乱码显示

问题描述 如上图所示&#xff0c;最近在学习C#突然发现我在运行Hello World的时候出现这样的乱码情况。 分析原因 主要是因为VS Code 是UTF-8的编码格式&#xff0c;而我们的PC是Unicode编码&#xff0c;所以我们需要对其进行一个统一即可解决问题。那么知道这个的问题那就开…

创建进程中的内核操作

fork 是一个系统调用&#xff0c;流程的最后会在 sys_call_table 中找到相应的系统调用 sys_fork。 _do_fork 里面做的第一件大事就是 copy_process&#xff0c;咱们前面讲过这个思想。如果所有数据结构都从头创建一份太麻烦了&#xff0c;还不如使用惯用“伎俩”&#xff0c;…

Go命令行参数操作:os.Args、flag包

Go命令行参数操作&#xff1a;os.Args、flag包 最近在写项目时&#xff0c;需要用到命令行传入的参数&#xff0c;正好借此机会整理一下。 1 os.Args&#xff1a;程序运行时&#xff0c;携带的参数&#xff08;包含exe本身&#xff09; package mainimport ("fmt"&q…

名人问题(分类讨论),士兵问题(找规律)

【名人问题】n个人中的名人是指这样一个人:他不认识别人&#xff0c;但是每个人都认识他。任务就是找出这样一个名人&#xff0c;但只能通过询问“你认识他/她吗?”这种问是来完成。设计一个高效算法&#xff0c;找出该名人或者确定这群人中没有名人。你的算法在最坏情况下需要…