首页 > 其他分享 >Atcoder ABC340(A-D)

Atcoder ABC340(A-D)

时间:2024-02-13 15:22:07浏览次数:29  
标签:Atcoder cout int ios 花费 ABC340 add tie

A题
题意:
给出一个首项为A,尾项为B,公差为D的算数序列,要求输出符合条件的序列
思路:
只需要从首项开始每次加上公差输出即可
代码:

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

int add(int x, int y){return x ? add((x & y) << 1, x ^ y): y;}

#define ONLINE_JUDGE

int a,b,d;

int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
#endif
    ios;
    cin>>a>>b>>d;
    while(a<=b)
    {
        cout<<a<<" ";
        a+=d;
    }
    cout<<"\n";
    return 0;
}

B题
题意:
最开始给出一个空序列A和Q次查询。查询以下有两种类型:
1 x 将x追加到A的末尾
2 k 从A的末尾开始查找第K个数的值。当给出这个查询时,保证A序列的长度至少为k。
思路:
用一个数组A存贮A序列的值,cnt代表序列长度,每次执行将x追加到A的末尾时,将cnt+1,从A的末尾开始查找第K个数的值时输出A[cnt-k+1]即可。
代码:

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

int add(int x, int y){return x ? add((x & y) << 1, x ^ y): y;}

#define ONLINE_JUDGE

int n,cnt;
int a[110];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
#endif
    ios;
    cin>>n;
    int k,x;
    for(int i=1;i<=n;i++)
    {
        cin>>k>>x;
        if(k==1)
        {
            a[++cnt]=x;
        }
        else
        {
            cout<<a[cnt-x+1]<<"\n";
        }
    }

    return 0;
}

C题
题意:
给出一个N,有一个操作将X分解为(X/2)与((X+1)/2),每次执行这个操作的花费为X,一直重复这个操作直到分解出的所有数都小于2为止,要求求出所需的花费为多少。
思路:
思路一:
由题可知X=(X/2)+((X+1)/2),利用递归将结果求出。
思路二:
当所有(X/2)与((X+1)/2)相同时,N为2的K次,花费为kN,
当N不为2的k次时,令m为小于N的最大的2的k次,,则还缺少N-m的花费,其花费为2
(N-m),那么最终花费为kN+2(N-m)。
代码:

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

int add(int x, int y){return x ? add((x & y) << 1, x ^ y): y;}

#define ONLINE_JUDGE

typedef long long ll;
ll n;
ll res=2,sum;

int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
#endif
    ios;
    cin>>n;
    sum=n;
    while((res<<1)<=n)
    {
        res<<=1;
        sum+=n;
    }
    sum+=((n-res)<<1);
    cout<<sum<<"\n";
    return 0;
}

D题
题意:
一个游戏由N个阶段组成,最初只有1阶段可以玩。
对于每一个阶段i,有以下两个操作:
1.花费ai时间通过阶段i,进入阶段i+1
2.花费bi时间通过阶段i,进入阶段xi
要求求出至少需要多少时间才能通关N。
思路:
最开始我想到的是dp,但是dp很难处理有环的情况,因此dp无法通过这一题,考虑建图求最短路来通过这题。
建立一个有向图将信息存贮,每一个节点i分别连接两个节点i+1与xi,权值分别为ai和bi,跑一遍最短路即可得到答案。
代码:

#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

int add(int x, int y){return x ? add((x & y) << 1, x ^ y): y;}

#define ONLINE_JUDGE

typedef long long ll;
typedef pair<ll,ll> PLL;
const int N=2e5+10;
ll n,d[N],vis[N];
vector<PLL> e[N];

int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
#endif
    ios;
    cin>>n;
    for(ll i=1;i<n;i++)
    {
        ll a,b,x;
        cin>>a>>b>>x;
        e[i].push_back({i+1,a});
        e[i].push_back({x,b});
    }
    memset(d,0x3f,sizeof(d));
    priority_queue<PLL> q;
    q.push({0,1});
    d[1]=0;
    while(!q.empty())
    {
        ll u=q.top().second;
        q.pop();
        if(vis[u])
        {
            continue;
        }
        vis[u]=1;
        for(auto p : e[u])
        {
            ll v=p.first,w=p.second;
            if(d[v]>d[u]+w)
            {
                d[v]=d[u]+w;
                if(!vis[v])
                {
                    q.push({-d[v],v});
                }
            }
        }
    }
    cout<<d[n]<<"\n";
    return 0;
}

标签:Atcoder,cout,int,ios,花费,ABC340,add,tie
From: https://www.cnblogs.com/Aliciaandsakura/p/18014595

相关文章

  • AtCoder Beginner Contest 340 考试总结
    前言可惜的是我是VP的,却打得相对较好(服了。得分明细:ABCDEFGTotal√√√√√√×2625改题明细:ABCDEFG√√√√√√×第一次打AT,发挥还可以。A.ArithmeticProgressionProblem打印一个包含第一项\(A\),最后一项\(B\)......
  • ABC340G Leaf Color
    题意给定一棵树\(T\),包含\(n\)个节点,每个节点有颜色。求有多少个\(T\)的导出子图\(T'\),满足\(T'\)中的叶子节点颜色相同。答案对\(998244353\)取模。\(n\le2\times10^5\)。分析由于叶子节点的限制极其特殊,考虑从叶子的角度思考问题。如果知道了叶子节点的集合,那......
  • ABC340 E&F
    E每次操作的本质:将\(b_i\)盒子的球数置为\(0\),设取出球数为\(c\)。若\(n-b_i\gec\),则给区间\([b_i+1,b_i+c]\)球数加1。否则,先给\([b_i+1,n]\)加1,再全局加\(\frac{c-n+b_i}{n}\),设最终剩下的球数为\(c'(c'<n)\),给\([1,c']\)球数加1。使用任何可以维护区间......
  • Atcoder Educational DP Contest 题解
    比赛链接:Atcoderr或者题单A:Frog1常规线性dp,注意到对于每个落点来说,青蛙只能由第\(i-1\)个石头或者第\(i-2\)个石头转移得到,那么我们让\(dp[i]\)为当跳到第\(i\)个石头上的最小费用。此时显然有:\[dp_i=\min(dp_{i-1}+\left|h_i-h_{i-1}\right|,dp_{i-2}+\left|h_......
  • ABC340
    Alink模拟。Blink模拟指针。Clink记忆化搜索。时间复杂度证明可以从一个奇数分多遍以后只会有两种数这一角度入手。Dlink由于每次只能选择一种,于是可以将选择变成连边,进行最短路。Elink线段树入门。取余操作本身就是一个环。注意题目中的操作是从\(0\simn-1\)。......
  • ABC340
    \(\huge{C}\)link首先,考虑暴力,用一个堆,存所有数,每次拿出最大的数,拆开加入堆,计入答案,直到最大的\(\le1\),时间复杂度\(O(\text{不能过})\)。考虑想求出\(n\),要什么。求\(n\)一定是第一次把\(n\)拆成\(\lfloor{\frac{n}{2}}\rfloor\)和\(\lceil{\frac{n}{2}}\rceil\),答案加上\(n......
  • ABC340
    T1:ArithmeticProgression模拟代码实现a,b,d=map(int,input().split())foriinrange(a,b+1,d):print(i,end='')T2:Append模拟代码实现q=int(input())a=[]forqiinrange(q):type,x=map(int,input().split())iftype==1:......
  • AtCoder-abc340_f题解
    题意简述给定整数\(x,y\),询问是否存在整数\(a,b\),满足:\(-10^{18}\lea,b\le10^{18}\)。由\((0,0),(x,y),(a,b)\)三点构成的三角形面积为\(1\)。如果存在,输出任意一组;否则输出-1。思路先假设\(x,y,a,b\)都是正数。那么图大概是这样:此时红色三角形的面积就......
  • AtCoder Beginner Contest 340
    A-ArithmeticProgression(abc340A)题目大意给定等差数列的首项、末项、公差。输出这个等差数列。解题思路从首相依次累加公差到末项即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_std......
  • ABC340
    E我们可以知道每一个点在每一轮加多少,具体如下:假如现在操作的点的为\(k\)。那么所有的数都至少会加\(\dfrac{A_k}{n}\)。但是肯定有剩的,剩了\(A_k\modn\)。很明显,\(A_k\modn\)会分给接下来的\(A_k\modn\)个数。这样我们就可以知道每个点每轮加多少了。然后用线段......