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

AtCoder Beginner Contest 376

时间:2024-10-20 08:51:08浏览次数:9  
标签:AtCoder main Beginner int ll 200010 ans 376 dis

AtCoder Beginner Contest 376

\(A\) Candy Button

  • 贪心,模拟。

    点击查看代码
    int main()
    {
        ll n,c,x,last=-0x3f3f3f3f,ans=0,i;
        cin>>n>>c;
        for(i=1;i<=n;i++)
        {
            cin>>x;
            if(x-last>=c)
            {
                last=x;
                ans++;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    

\(B\) Hands on Ring (Easy)

  • 每次移动都选近的一遍。正确性好像不是很显然?

    点击查看代码
    int main()
    {
        int n,q,t,ans=0,l=1,r=2,i;
        char h;
        cin>>n>>q;
        for(i=1;i<=q;i++)
        {
            cin>>h>>t;
            if(h=='L')
            {
                if(l>t)
                {
                    if(t<=r&&r<=l)	
                    {
                        ans+=n-(l-t);
                    }
                    else
                    {
                        ans+=l-t;
                    }
                    
                }
                else
                {
                    if(l<=r&&r<=t)	
                    {
                        ans+=n-(t-l);
                    }
                    else
                    {
                        ans+=t-l;
                    }
                }
                l=t;
            }
            else
            {
                if(r>t)
                {
                    if(t<=l&&l<=r)	
                    {
                        ans+=n-(r-t);
                    }
                    else
                    {
                        ans+=r-t;
                    }
                }
                else
                {
                    if(r<=l&&l<=t)	
                    {
                        ans+=n-(t-r);
                    }
                    else
                    {
                        ans+=t-r;
                    }
                }
                r=t;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    

\(C\) Prepare Another Box

  • 模拟,懒得写双指针,所以用 multiset 代替了。

    点击查看代码
    ll a[200010];
    multiset<ll>f;
    multiset<ll>::iterator it;
    int main()
    {
        ll n,ans=-1,x,pos,i;
        cin>>n;
        for(i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(i=1;i<=n-1;i++)
        {
            cin>>x;
            f.insert(x);
        }
        sort(a+1,a+1+n);
        for(i=n;i>=1;i--)
        {
            it=f.lower_bound(a[i]);
            if(it!=f.end())
            {
                f.erase(it);
            }
            else
            {
                if(ans==-1)
                {
                    ans=a[i];
                }
                else
                {
                    ans=-1;
                    break;
                }
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    

\(D\) Cycle

  • 如果是无向图(不能重复走某条边)的话,就是 暑假集训CSP提高模拟19 T2 P160. 那一天她离我而去 了。

  • 因为是有向图,所以处理出到指向 \(1\) 的节点的最短路再多走一条边即可。

    点击查看代码
    int vis[200010],dis[200010];
    vector<pair<int,int> >broke,e[200010];
    void add(int u,int v,int w)
    {
        e[u].push_back(make_pair(v,w));
    }
    void dijkstra(int s)
    {
        memset(dis,0x3f,sizeof(dis));
        memset(vis,0,sizeof(vis));
        priority_queue<pair<int,int> >q;
        dis[s]=0;
        q.push(make_pair(-dis[s],-s));
        while(q.empty()==0)
        {
            int x=-q.top().second;
            q.pop();
            if(vis[x]==0)
            {
                vis[x]=1;
                for(int i=0;i<e[x].size();i++)
                {
                    if(dis[e[x][i].first]>dis[x]+e[x][i].second)
                    {
                        dis[e[x][i].first]=dis[x]+e[x][i].second;
                        q.push(make_pair(-dis[e[x][i].first],-e[x][i].first));
                    }
                }
            }
        }
    }
    int main()
    {
        int n,m,ans=0x3f3f3f3f,u,v,w,i;
        cin>>n>>m;
        for(i=1;i<=m;i++)
        {
            cin>>u>>v;
            w=1;
            if(v==1)
            {
                broke.push_back(make_pair(u,w));
            }
            add(u,v,w);
        }
        dijkstra(1);
        for(i=0;i<broke.size();i++)
        {
            ans=min(ans,dis[broke[i].first]+broke[i].second);
        }
        cout<<((ans==0x3f3f3f3f)?-1:ans)<<endl;
        return 0;
    }
    
    

\(E\) Max × Sum

  • 按 \(\{ a \}\) 排序后钦定选择某个数再在前缀中选前 \(k-1\) 小的数加和。

  • 优先队列维护即可。

    点击查看代码
    struct node
    {
        ll a,b;
    }e[200010];
    bool cmp(node a,node b)
    {
        return a.a<b.a;
    }
    priority_queue<ll>q;
    int main()
    {
        ll t,n,k,ans,sum,i,j;
        cin>>t;
        for(j=1;j<=t;j++)
        {
            ans=1e18;
            sum=0;
            cin>>n>>k;
            while(q.empty()==0)
            {
                q.pop();
            }
            for(i=1;i<=n;i++)
            {
                cin>>e[i].a;
            }
            for(i=1;i<=n;i++)
            {
                cin>>e[i].b;
            }
            sort(e+1,e+1+n,cmp);
            for(i=1;i<=k-1;i++)
            {
                q.push(e[i].b);
                sum+=e[i].b;
            }
            for(i=k;i<=n;i++)
            {	
                ans=min(ans,e[i].a*(sum+e[i].b));
                q.push(e[i].b);
                sum-=q.top();
                sum+=e[i].b;
                q.pop();
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    

\(F\) Hands on Ring (Hard)

  • 等有时间再来补。

\(G\) Treasure Hunting

  • 等有时间再来补。

总结

  • \(D\) 把无向图做法贺过来就直接交了,然后吃了 \(2\) 发罚时。
  • \(E\) 原权值线段树找到第 \(k-1\) 小的数然后求前缀和的做法假了,原因是若第 \(k-1\) 小的数如果有多个,就会额外统计。

标签:AtCoder,main,Beginner,int,ll,200010,ans,376,dis
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18486902

相关文章

  • [ABC376E] Max × Sum 题解
    [ABC376E]Max×Sum题解原题链接洛谷链接一道简单的推性质题,首先明确一个性质,子集是非连续的,所以在计算时并不用连续区间求。拿过题来,首先想的是枚举\(B\)的最小子集,但其复杂度为\(O(C_N^K)\)复杂度过高,不足以通过本题。于是转变思路,枚举\(A\)之中的最大值。若\(a_i......
  • AtCoder Beginner Contest 371 - VP记录
    总体发挥还算正常A-Jiro呵呵呵,有人像我这么做的吗?点击查看代码#include<cstdio>usingnamespacestd;intmain(){ charab,ac,bc; scanf("%c%c%c",&ab,&ac,&bc); if(ab=='<'&&ac=='<'&&bc=='<')......
  • C - Word Ladder (Toyota Programming Contest 2024#9 (AtCoder Beginner Contest 370)
    题目链接:C-WordLadder题目:样例:分析:不要被题目所吓到,一切长题目都是纸老虎。题目大意就是给你两个字符串s和t,一次只能更换一个字母,求s变到t更换的次数,并输出每次更换一个字母后的最小字典序字符串。题意好理解,可以直接暴力,大力出奇迹。但是有没有更好的方法呢?既然问了......
  • 358G AtCoder Tour
    358G思维题#include<bits/stdc++.h>#definelllonglongusingnamespacestd;intn,m,s,t,vis[55][55][2505],k;lldis[55][55][2505],v[55][55],ans;intmvx[]={-1,1,0,0};intmvy[]={0,0,-1,1};structNode{intx,y,d;};queue<Node>q;void......
  • 浏览器安装 AtCoder Better 和 Codeforces Better 插件
    你首先需要篡改猴。如果你用的Google浏览器,请用这个Link,不过你可能需要挂个梯子。如果你用的Firefox浏览器,请用这个Link,这个不需要梯子。如果你用的edge浏览器,请用这个Link,这个也不需要梯子。下载好篡改猴之后,无论什么浏览器,点击这个链接,安装AtCoderBetter插件;点......
  • AtCoder ABCD做题计划
    vjudge链接AtCoderBeginnerContest360ABCDAtCoderBeginnerContest359ABCDAtCoderBeginnerContest358ABCDAtCoderBeginnerContest357ABCDAtCoderBeginnerContest356ABCDAtCoderBeginnerContest355ABCDAtCoderBegi......
  • AtCoder Beginner Contest 374 (A-E)
    AtCoderBeginnerContest374(A-E)比赛链接A-Takahashisan2#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;voidShowball(){strings;cin>>s;intn=s.size();cout<<(s.substr(n-3)=="san"......
  • 代码随想录算法训练营第三十一天|455.分发饼干 376. 摆动序列 53. 最大子序和
    455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j] 。如果s[j] >=g[i],我们可以将这个饼干j分配给孩子i,......
  • AtCoder Beginner Contest 375
    A-Seats#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineintlonglongusingvi=vector<int>;usingpii=pair<int,int>;i32main(){ios::sync_with_stdio(false),cin.tie(null......
  • DAY31 ||贪心算法基础 | 455.分发饼干 |376.摆动序列 |53.最大子数组和
    贪心算法基础贪心算法是一种在求解问题时采取逐步构建解决方案的算法策略。它通过在每一步选择在当前看来最优的选择(即“贪心”选择),希望通过局部最优解的累积得到全局最优解。贪心算法的核心思想局部最优:每一步都选择在当前状态下最优的选择,不考虑后续步骤可能带来的影响。......