首页 > 其他分享 >AtCoder Beginner Contest 328

AtCoder Beginner Contest 328

时间:2023-12-04 19:14:59浏览次数:30  
标签:AtCoder return Beginner int long fa solve 328 define

AtCoder Beginner Contest 328

链接:Toyota Programming Contest 2023#7(AtCoder Beginner Contest 328) - AtCoder

A

题意:给定n个数,将小于等于x的数加起来输出。

#include <bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;

void solve(){
    int n,x;
    cin>>n>>x;
    int ans=0;
    for(int i=0;i<n;i++){
        int y;
        cin>>y;
        if(y<=x) ans+=y;
    }
    cout<<ans<<endl;
}


signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--)solve();
    return 0;
}

B

(开始还把题意理解错了)

#include <bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;

void solve(){
    int n;
    cin>>n;
    int ans=0;
    for(int i=1;i<=n;i++){
        int y;
        cin>>y;
        int z=i;
        int x=i%10;
        while(z){
            if(x!=z%10){
                x=-1;
                break;
            }
            z/=10;
        }
        if(x==-1) continue;
        z=x;
        while(z<=y){
            ans++;
            z=z*10+x;
        }
    }
    cout<<ans<<endl;
}


signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--)solve();
    return 0;
}

C

前缀和预处理一下就行。

#include <bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;

const int N = 3e5 + 10;
int pre[N];

void solve(){
    int n,q;
    string s;
    cin>>n>>q;
    cin>>s;
    s=" " + s;
    for(int i=1;i<n;i++)
        if(s[i]==s[i+1]) pre[i]++;
    for(int i=1;i<=n;i++) pre[i]+=pre[i-1];
    for(int i=0;i<q;i++){
        int l,r;
        cin>>l>>r;
        cout<<pre[r-1]-pre[l-1]<<endl;
    }
}


signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--)solve();
    return 0;
}

D

思路有点向括号匹配,将字符压进栈。如果遇见ABC就把ABC弹出。

#include <bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;

void solve(){
    string s;
    deque<char> path;
    cin>>s;
    for(int i=0;i<s.size();i++){
        path.push_back(s[i]);
        if(path.size()>=3){
            int len=path.size();
            if(path[len-1]=='C'&&path[len-2]=='B'&&path[len-3]=='A')
                for(int i=0;i<3;i++) path.pop_back();
        }
    }
    for(auto v:path) cout<<v;
}


signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--)solve();
    return 0;
}

E

在m条边里面选n-1条构成生成树。

可以深搜把所有选择都找出来然后暴力试试能不能构成生成树。

AC代码

#include <bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;

const int N = 10100;
struct edg{
    int u,v,w;
}edge[N];
int n,m,k;
int fa[N];
vector<vector<int>> check;
vector<int>         path;
int Find(int x){
    return x==fa[x] ? x :fa[x]=Find(fa[x]);
}

void dfs(int starindex,int deepth){
    if(deepth==n){
        check.push_back(path);
        return;
    }
    for(int i=starindex;i<m;i++){
        path.push_back(i);
        dfs(i+1,deepth+1);
        path.pop_back();
    }
}

void solve(){
    cin>>n>>m>>k;
    for(int i=0;i<m;i++) cin>>edge[i].u>>edge[i].v>>edge[i].w;
    dfs(0,1);
    int ans=k+1;
    //cout<<check.size()<<endl;
    for(auto q:check){
        for(int i=1;i<=n;i++) fa[i]=i;
        int sum=0;
        bool OK=true;
        for(auto x:q){
            int u=edge[x].u;
            int v=edge[x].v;
            int w=edge[x].w;
            int ta=Find(u);
            int tb=Find(v);
            if(ta==tb){
                OK=false;
                break;
            }
            fa[ta]=tb;
            sum=(sum+w)%k;
        }
        if(OK)ans=min(sum,ans);
    }
    cout<<ans<<endl;
}


signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--)solve();
    return 0;
}

F

一个很典的带权并查集

#include <bits/stdc++.h>
#define int long long
#define endl '\n';
using namespace std;

const int N = 2e5 + 10;
int fa[N];
int w[N];

int Find(int x){
    if(fa[x]!=x){
        int pa = Find(fa[x]);
        w[x] += w[fa[x]];
        fa[x] = pa;
    }
    return fa[x];
}

void solve(){
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        fa[i]=i;
    }
    for(int i=0;i<q;i++){
        int a,b,d;
        cin>>a>>b>>d;
        int ta=Find(a);
        int tb=Find(b);
        if(ta!=tb){
            w[ta] = w[b] + d - w[a];
            fa[ta] = tb;
            cout<<i+1<<" ";
        }else if(w[a]-w[b]==d)
            cout<<i+1<<" ";
    }
}

signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--)solve();
    return 0;
}

标签:AtCoder,return,Beginner,int,long,fa,solve,328,define
From: https://www.cnblogs.com/zfxyyy/p/17875702.html

相关文章

  • AtCoder Beginner Contest 331
    AtCoderBeginnerContest331这场状态好差,下午的校赛也打的好差。A-Tomorrow#include<bits/stdc++.h>#defineintlonglong#defineendl'\n'usingnamespacestd;voidsolve(){intM,D;inty,m,d;cin>>M>>D>>y>>m>&......
  • AtCoder Beginner Contest 331 G Collect Them All
    洛谷传送门AtCoder传送门设数字\(i\)第一次拿到的时间为\(t_i\),所求即为\(E(\max\limits_{i=1}^mt_i)\)。施min-max容斥,有:\[\begin{aligned}E(\max\limits_{i=1}^mt_i)&=\sum\limits_{T\subseteq[1,m]\landT\ne\varnothing}(-1)^{|T|-1}E(\min\l......
  • AtCoder Beginner Contest 331
    B-BuyOneCartonofMilk难度:⭐题目大意选择有三种套餐,6个鸡蛋S元,8个鸡蛋M元,12个鸡蛋L元;问如果要买至少N个鸡蛋,最少花费多少钱;解题思路一道入门级dp;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSios::sync_with_stdio(false......
  • AtCoder Beginner Contest 295
    B-Bombs题意:就是说有一种炸弹,能炸曼哈顿距离的障碍物,要你打印出炸完后的图模拟#include<bits/stdc++.h>usingnamespacestd;charmp[50][50];voidsolve(){ intn,m; cin>>n>>m; for(inti=1;i<=n;i++){ for(intj=1;j<=m;j++){ cin>>mp[i][j]; } } for......
  • AtCoder Beginner Contest 326
    B-326-likeNumbers题意:找到一个不小于n的数是326数,定义是思路:简单的模拟循环即可#include<bits/stdc++.h>usingnamespacestd;boolcheck(intx){ vector<int>a; while(x){ a.push_back(x%10); x/=10; } if(a[1]*a[2]==a[0])returntrue; elsereturnfalse;}......
  • AtCoder_abc326
    T12UP3DOWN简单的if判断,做题一分钟,翻译十分钟。。。代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ intx,y;cin>>x>>y; if((x<=y&&y-x<=2)||(x>y&&x-y<=3)) cout<<"Yes"; elsecout<<"No&......
  • AtCoder_abc327
    T1ab循环从s[0]到s[n-2]判断有无ab相邻T2A^A两层循环枚举就可以了由于aa会增长的很快,所以当a=16时aa就已经大于$10^{18}$了,一定不会T就这么点数打表也能过T3NumberPlace就是数独的判断规则,h,l,g三个数组存储已有的数就好宫的判断我用了一个三维数组前两个维度表示宫的......
  • AtCoder_abc329
    AtCoder_abc329比赛链接A-SpreadA题链接题目大意输入一个字符串由大写字母组成的$S$,输出$S$并在每一个字符之间加上空格解题思路随便打打就能过.jpg代码//Problem:A-Spread//Contest:AtCoder-SkyInc,ProgrammingContest2023(AtCoderBeginnerContest329)//......
  • AtCoder_abc330
    AtCoder_abc330比赛链接A-CountingPassesA题链接题目大意给出$N$个数$a_1,a_2,a_3\cdots,a_N$,和一个正整数$L$。输出有几个$a_i\leL$.解题思路O(n)遍历一遍就好了代码//Problem:A-CountingPasses//Contest:AtCoder-TOYOTASYSTEMSProgrammingContest20......
  • AtCoder_abc331
    AtCoder_abc331(这次题真的真的真的好难)比赛链接A-Tomorrow题目链接题目大意有一个$M$个月,$D$天的日历,请输出$y年m月z日$的下一天。解题思路先让天数加一,如果超过了$D$就让月份加一,天数减$D$,然后月份同理代码//Problem:A-Tomorrow//Contest:AtCoder-DaiwaSec......