首页 > 其他分享 >AtCoder Beginner Contest 308 A~F

AtCoder Beginner Contest 308 A~F

时间:2023-07-02 18:11:59浏览次数:44  
标签:308 AtCoder Beginner int t2 t1 ar mp op

AtCoder Beginner Contest 308

image-20230702174419133

手速有点慢

A - New Scheme

判断给定数字是否满足条件

void solve()
{       
	bool ok = true;
	int a[10];
	for(int i = 1; i <= 8; i++)
		cin>>a[i];
	for(int i = 1; i <= 8; i++)
	{
		if(i >= 2 && a[i] < a[i - 1])
			ok = false;
		if(a[i] % 25 != 0)
			ok = false;
		if(a[i] < 100 || a[i] > 675)
			ok = false;
	}
	if(ok)
		cout<<"Yes\n";
	else
		cout<<"No\n";
    return;
}

B - Default Price

给出要买的颜色,和一些颜色价格,算出总花费,用 map<string, int> mp; 统计要买的数量,然后直接算

map<string, int> mp;
void solve()
{       
    int n, m;
    cin>>n>>m;
 
    for(int i = 1; i <= n; i++)
    {
        string t;   cin>>t;
        mp[t]++;
    }
    string op[1100];
    for(int i = 1; i <= m; i++)
        cin>>op[i];
    int p0, cnt = 0;
    cin>>p0;
    int res = 0;
    for(int i = 1; i <= m; i++)
    {
        int x;  cin>>x;
        if(mp[op[i]] >= 1)
            res += x * mp[op[i]], cnt += mp[op[i]];
    }
    cout<<res + (n - cnt) * p0<<'\n';
    return;
}

C - Standings

tag:排序,模拟

为避免精度产生的误差,cmp为

\[\dfrac{a}{a + b} < \dfrac{c}{c + d} \\ ac + ac < ca + cb \]

array<ll, 3> ar[N];
bool cmp(array<ll, 3> t1, array<ll, 3> t2)
{
    ll a = t1[0] * (t2[0] + t2[1]), b = t2[0] * (t1[0] + t1[1]);
    if(a == b)
    {
        return t1[2] < t2[2];
    }
    else 
        return a > b;
}
void solve()
{       
    int n;  cin>>n;
    for(int i = 1; i <= n; i++)
    {
        cin>>ar[i][0]>>ar[i][1];
        ll t = __gcd(ar[i][0], ar[i][1]);
        ar[i][0] /= t, ar[i][1] /= t, ar[i][2] = i;
    }
    sort(ar + 1, ar + 1 + n, cmp);
    for(int i = 1; i <= n; i++)
        cout<<ar[i][2]<<" ";
    cout<<'\n';
    return;
}

D - Snuke Maze

bfs 再记录当前走到哪个字母的信息即可

char op[N][N];
int f[N][N];
int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};
void solve()
{       
    int n, m;   cin>>n>>m;
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
        {
            cin>>op[i][j];
            f[i][j] = 1e9;
        }
    
    map<char, int> mp;
    mp['s'] = 1;
    mp['n'] = 2;
    mp['u'] = 3;
    mp['k'] = 4;
    mp['e'] = 5;
    queue<array<int, 3>> q;
 
    if(op[1][1] == 's')
    {
        q.push({1, 1, 1});
        f[1][1] = 0;
    }
    while(!q.empty())
    {
        auto t = q.front(); q.pop();
        int tx = t[0];
        int ty = t[1];
        int flag = t[2];
        if(flag == 5)   flag = 1;
        else flag++;
        for(int i = 0; i < 4; i++)
        {
            int x = tx + dx[i];
            int y = ty + dy[i];
            if(x < 1 || x > n || y < 1 || y > m)    continue;
            int g = mp[op[x][y]];
            if(flag != g)   continue;
            if(f[x][y] > f[tx][ty] + 1)
            {
                f[x][y] = f[tx][ty] + 1;
                q.push({x, y, g});
            }
        }
    }   
    if(f[n][m] == 1e9)
        cout<<"No\n";
    else
        cout<<"Yes\n";
    return;
}

E - MEX

统计后缀信息,sx统计后缀含有 \(\texttt{X}\) 集合 \(0,1,2\) 的数量, se统计后缀含有 \(\texttt{EX}\) 集合 \(0,1,2,01,02,12\) 的数量,然后直接对每个 \(\texttt{M}\) 对应的数字和后缀 \(\texttt{se}\) 分类讨论即可

我这题的写法没那么美观,但看起来很暴力。

ll m[N][11], e[N][11], x[N][11];
ll sm[N][11], se[N][11], sx[N][11];
 
int n, a[N];
char op[N];
void solve()
{       
    cin>>n;
    for(int i = 1; i <= n; i++)
        cin>>a[i];
    for(int i = 1; i <= n; i++)
        cin>>op[i];
    for(int i = 1; i <= n; i++)
    {
        if(op[i] == 'M')
            m[i][a[i]]++;
        else if(op[i] == 'E')
            e[i][a[i]]++;
        else if(op[i] == 'X')
            x[i][a[i]]++;
    }
    for(int i = n; i >= 1; i--)
        for(int j = 2; j >= 0; j--)
            sx[i][j] = sx[i + 1][j] + x[i][j];
    for(int i = n; i >= 1; i--)
    {
        for(int j = 5; j >= 0; j--)
        {
            se[i][j] = se[i + 1][j];
        }
        if(op[i] == 'E')
        {
            if(a[i] == 0)
            {
                //cout<<"!!\n";
                se[i][0] += sx[i][0];
                se[i][3] += sx[i][1];
                se[i][4] += sx[i][2];
            }   
            else if(a[i] == 1)
            {
                se[i][1] += sx[i][1];
                se[i][3] += sx[i][0];
                se[i][5] += sx[i][2];
            } 
            else if(a[i] == 2)
            {
                se[i][2] += sx[i][2];
                se[i][4] += sx[i][0];
                se[i][5] += sx[i][1];
            }
        }
    }
 
 
 
    ll res = 0;
    for(int i = 1; i <= n; i++)
    {
        if(op[i] == 'M')
        {
            if(a[i] == 0)
            {
                res += 2ll * (se[i][1] + se[i][3]);
                res += se[i][2] + se[i][4] + se[i][0];
                res += 3ll * se[i][5];
            }   
            else if(a[i] == 1)
            {
                res += 2ll * (se[i][0] + se[i][3]);
                res += 3ll * se[i][4];
            } 
            else if(a[i] == 2)
            {
                res += se[i][0] + se[i][4];
                res += 3ll * se[i][3];
            }
        }
    }
    cout<<res<<'\n';
    return;
}

F - Vouchers

贪心,对优惠券按折扣降序排序,将所有商品价格放进multiset,然后找出已有商品大于等于要求金额最小的商品,将它从multiset中删除

int n, m;
ll a[N];
pair<ll, ll> b[N];
multiset<int> s;
bool cmp(pair<ll, ll> t1, pair<ll, ll> t2)
{
    if(t1.second == t2.second)
        return t1.first > t2.first;
    return t1.second > t2.second;
}   
 
void solve()
{       
    cin>>n>>m;
    ll res = 0;
    for(int i = 1; i <= n; i++)
    {
        cin>>a[i];
        res += a[i];
        s.insert(a[i]);
    }
    for(int i = 1; i <= m; i++)
        cin>>b[i].first;
    for(int i = 1; i <= m; i++)
        cin>>b[i].second;
    sort(b + 1, b + 1 + m, cmp);
    for(int i = 1; i <= m; i++)
    {
        if(s.lower_bound(b[i].first) == s.end())
            continue;
        int p = *s.lower_bound(b[i].first);
        res -= b[i].second;
        s.erase(s.find(p));
    }
    cout<<res<<'\n';
    return;
}

G - Minimum Xor Pair Query

待补,赛时写了trie,但没搞出来,好像正解也不是这个
去看佬们的blog学习

标签:308,AtCoder,Beginner,int,t2,t1,ar,mp,op
From: https://www.cnblogs.com/magicat/p/17521119.html

相关文章

  • AtCoder Beginner Contest 308
    A:1#include<cstdio>2#include<cstring>3#include<algorithm>4#include<iostream>5#include<string>6#include<vector>7#include<stack>8#include<bitset>9#include<cstdlib>10#include......
  • abc308
    E考虑分开处理,我们枚举中间的E,然后再枚举前面的M和后面的X分别是什么。这样的话,我们会发现,对于相同的\((A_i,A_j,A_k)\),其贡献是相同的。我们可以记录前缀和后缀中,\(A_i\)为某个值的M和X数量,然后计算个数,单独处理MEX即可。lln,pre[200005][3],suf[200005][3],a[2......
  • 【atcoder beginner 308E - MEX】
    前缀和二分查找打表枚举代码如下importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.StreamTokenizer;importjava.util.ArrayList;importjava.util.List;publicclassMain{publicstaticIntege......
  • AtCoder Grand Contest 021 E Ball Eat Chameleons
    洛谷传送门AtCoder传送门容易发现一个变色龙是红色当且仅当,设\(R\)为红球数量,\(B\)为蓝球数量,那么\(R\geB\)或\(R=B\)且最后一个球是蓝球。考虑如何判定一个颜色序列是否可行。考虑贪心。若\(R<B\)显然不行。若\(R\geB+n\),每个变色龙都可以分到比蓝球......
  • AtCoder Beginner Contest 307(E,F,G)
    AtCoderBeginnerContest307(E,F,G)E(dp)E这个题大意就是我们需要组成一个长度为\(n\)的数组,满足两个相邻的数字不可以相等,其中,\(a_1\)和\(a_n\)也是相邻的,我们可以选择的数字为\(0\)到\(m-1\),问最后有多少种不同的组成方式满足以上条件。题目大意很简单,就是有点难想,如果\(a......
  • Atcoder Beginner Contest 251-260 EFG
    #251E-TakahashiandAnimals*1261,*环形dpACLink考虑环形dp,对于使用或者不使用\(1\)号饲料分别dp,然后取最小值即可。......
  • AtCoder Beginner Contest(abc) 297
    B-chess960题目大意给定一串字符串,里面一定包含2个'B',2个'R',1个'K',问该字符串是否满足以下两个条件,一是两个'B'所在位置奇偶性不同;二是'K'的位置在两个'R'之间解题思路签到题不多嗦了;神秘代码#include<bits/stdc++.h>#defineintlonglongusi......
  • AtCoder Beginner Contest 296 Ex Unite
    洛谷传送门AtCoder传送门不错的dp。考虑按行从上往下dp,并且把列的连通状态塞进dp状态里面。实际上就是塞一个并查集。判状态合法性就是当一个竖的全黑长条结束后,有没有跟别的列连起来。code//Problem:Ex-Unite//Contest:AtCoder-AtCoderBeginnerContest29......
  • AtCoder Beginner Contest 227 H Eat Them All
    洛谷传送门AtCoder传送门好奇特的题。考虑显式建图,那么这是一个\(9\)个结点,\(12\)条边的图,需要找到一条回路使得第\(i\)个点被经过\(a_i\)次。首先会有一个基本思路:先求出每条边经过的次数,然后每条边复制这么多次即可直接构造欧拉回路。其中每条边经过次数的限制就是,......
  • AtCoder Beginner Contest 306(ABC 306) E~F补题
    E题目大意给定数字$k$,规定数组$A$的函数$f(A)$:$A$数组前$k$大数字的和如$A=[1,3,7,~4]$,$k=2$,则$f(A)=7+4=11$现在给定最大数组长度$n$,有$q$组操作,每次将第$x$个数字修改为$y$,输出每次操作后的$f(A)$其中$0<k\leqn\leq5\times10^5,~q\leq5\times......