AtCoder ABC 247

本文介绍了四个不同的算法问题及其解决方案:字符串右移操作、唯一昵称选择、递归模拟数字序列和圆柱体球值计算。通过代码实现,展示了如何运用递归、模拟和位运算等技巧解决复杂问题。

A Move Right(水)

字符串右移一位 然后在左边补0

void solve()
{
    string s;
    cin >> s;
    s = '0' + s;
    s.erase(s.end() - 1);
    cout << s;
}

B Unique Nicknames(读题)

Description:

​ 每个人有两个备选名字 然后要给每个人从这两个里选一个命名

​ 要求任一人的名字 不能跟其他人的备选名字相同

Solution:

​ map存一下每个名字出现的次数 如果说一个人的两个名字都是出现了两次以上的 那就不行

​ 如果说一个人的备选名字相同的话 只用存一次(自行编写数据hack可得)

Code:

map<string, int> mp;
vector<pair<string, string> > q;

void solve()
{
    int n;
    cin >> n;
    string a, b;
    rep(i, 0, n)
    {
        cin >> a >> b;
        q.pb({a, b});
        if(a == b)  
        	mp[a] ++;
        else 
            mp[a] ++; mp[b] ++;
    }
 
    bool ok = true;
    rep(i, 0, n)
        if(mp[q[i].fi] >= 2 && mp[q[i].se] >= 2)    ok = false;
        
    if(ok)  puts("Yes");
    else puts("No");
}

C 1 2 1 3 1 2 1(递归)

Description:

​ 给定s(n) 要求输出s(n-1) n s(n-1)

​ 当n == 1 输出1 当n == 2 输出 1 2 1

Solution:

​ 递归模拟题意即可

Code:

void f(int x)
{
    if(x == 1)    {cout << 1 << ' '; return;}
    f(x - 1);
    cout << x << ' ';
    f(x - 1);
}
 
void solve()
{
    int n;
    cin >> n;
    f(n);
}

D Cylinder(模拟)

Description:

​ op1 在右端放入价值为x 数量为c的球 op2 从左端取出数量为c的球 并输出其价值和

Solution:

​ 先进先出 队列模拟即可 (队列里的元素是可以更改的 我sb了

Code:

queue<PII> q;
void solve()
{
    int Q;
    scanf("%d", &Q);
    int op, x, c;
    while(Q--)
    {
        scanf("%d", &op);
        if(op == 1)
        {
            scanf("%d%d", &x, &c); //fi: sum se: val
            q.push({c, x});
        }
        else 
        {
            scanf("%d", &c);
            LL res = 0;
            while(c)
            {
                LL d = c - q.front().fi < 0 ? c : q.front().fi; //特判一下就好
                q.front().fi -= d;
                c -= d;
                res += d * 1LL * q.front().se;
                if(q.front().fi == 0)   q.pop();
            }
            printf("%lld\n", res);
        }
    }
}

E Max Min(状压DP)

Description:

​ 给定数组长度为n的数组a 给定x 和 y

​ 要求寻找区间[l, r]的个数 区间要满足区间内所有元素小于等于x 大于等于y 且区间中必须存在x和y

Solution:

​ 首先定义一个dp数组 dp[i] [2] [2] 表示当前的右端点是i 然后区间内是否含有x 区间内是否含有y

​ 转移的时候呢 i可以向i+1转移 并i+1继承i中满足题意的状态 也就是区间上的连续的意思

​ 转移方程写为

rep(j, 0, 2)
	rep(k, 0, 2)
		dp[i][fx | j][fy | k] += dp[i - 1][j][k];

Code:

const int N = 200010;
int n, x, y, q[N], dp[N][2][2]; //以i为右端点的状态 1 1表示满足题意
LL res; 

void solve()
{
    scanf("%d%d%d", &n, &x, &y);
    rep(i, 1, n + 1)
        scanf("%d", &q[i]);

    dp[0][0][0] = 0;
    rep(i, 1, n + 1)
    {
        if(q[i] < y || q[i] > x)    continue; //dp[i][1][1] = 0;区间无法连续了
        int fx = q[i] == x, fy = q[i] == y; //满足存在x或y
        dp[i][fs][ft] += 1;
        rep(j, 0, 2)
            rep(k, 0, 2)
                dp[i][j | fx][k | fy] += dp[i - 1][j][k]; 
                //对于上一个状态而言 如果可以转移的话就相加
                
        res += dp[i][1][1]; //满足题意的情况
    }
    cout << res << endl;
}
关于 AtCoder Beginner Contest 387 的信息如下: ### 关于 AtCoder Beginner Contest 387 AtCoder Beginner Contest (ABC) 是一项面向编程爱好者的定期在线竞赛活动。对于 ABC387,该赛事通常会在周末举行,并持续大约100分钟,在此期间参赛者需解决一系列算法挑战问题。 #### 比赛详情 - **举办平台**: AtCoder Online Judge System[^2] - **比赛时间长度**: 大约为1小时40分钟 - **难度级别**: 初学者友好型,适合那些刚开始接触竞争性程序设计的人群参与 - **题目数量**: 一般情况下会提供四到六道不同难度级别的题目供选手解答 #### 题目概览 虽然具体细节可能因官方发布而有所变化,但可以预期的是,这些题目将会覆盖基础的数据结构、字符串处理以及简单图论等方面的知识点。每一道题目的描述都会清晰给出输入输出格式说明及样例测试数据以便理解需求并验证解决方案的有效性。 为了获取最准确的比赛时间和确切的题目列表,请访问 [AtCoder 官方网站](https://atcoder.jp/) 并查看最新的公告板或直接导航至对应编号的具体页面来获得更新的信息。 ```python import requests from bs4 import BeautifulSoup def get_contest_info(contest_id): url = f"https://atcoder.jp/contests/{contest_id}" response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') title_element = soup.find('title') problem_list_elements = soup.select('.panel.panel-default a[href^="/contests/{}/tasks"]'.format(contest_id)) contest_title = title_element.string.strip() if title_element else "Contest Title Not Found" problems = [element['href'].split('/')[-1] for element in problem_list_elements] return { "name": contest_title, "problems": problems } else: raise Exception(f"Failed to fetch data from {url}") abc_387_details = get_contest_info("abc387") print(abc_387_details) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值