atcoder abc 358

A welcome to AtCoder Land

题目:

思路:字符串比较

代码:

#include <bits/stdc++.h>

using namespace std;

int main() {
    string a, b;
    cin >> a >> b;
    if(a == "AtCoder" && b == "Land") cout << "Yes" << endl;
    else cout << "No" << endl;
    return 0;
}

B Ticket counter

题目:

思路:记录下第 i-1个人买完票的时间now,更新now 为max t[i], now后now + a  输出now

代码:

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, a;
    cin >> n >> a;

    vector<int> t(n + 1);
    int now = 0;//now表示上一个人买完票的时间
    for(int i = 1; i <= n; i ++ ) cin >> t[i];
    for(int i = 1; i <= n; i ++ ) {
        if(i == 1) {
            now = t[i] + a;
            cout << t[i] + a << endl;
        } else {
            now = max(t[i], now);
            now += a;
            cout << now << endl;
        }
    }
    return 0;
}

C popcorn

问题

思路:注意到n很小,考虑爆搜,现在思考一个问题,如何把时间尽可能的压缩。

1 字符串比较是浪费时间时间,因此可以考虑优先处理下字符串,这里的做法是状态压缩,o代表二进制的1,x代表2进制的0,两个摊位的爆米花口味是a | b。这样可以极大的节省时间

2 剪枝, 设全局最大值ans = 0, 如果在dfs过程中方案数大于ans直接return

3 排列组合优化 这里选的摊位并没有明确的顺序,因此先选a和先选b是一样的,可以在dfs中记录一个start

代码:

#include <bits/stdc++.h>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> str(n + 1);
    for(int i = 1; i <= n; i ++ ) {
        int cnt = 0;
        for(int j = 0; j < m; j ++ ) {
            char ok;
            cin >> ok;
            if(ok == 'o') cnt +=  1 << j;
        }
        str[i] = cnt;
    }

    vector<bool> st(n + 1, false);
    int ans = n;
    function<void(int, int, int)> dfs = [&](int u, int cnt, int res) -> void {
        if(cnt >= ans) return;
        if(res == ((1 << m) - 1)) ans = cnt;
        for(int i = u + 1; i <= n; i ++ ) {
            if(!st[i]) {
                st[i] = true;
                int tmp = res;
                res |= str[i];
                dfs(i, cnt + 1, res);
                st[i] = false;
                res = tmp;
            }
        }
    };
    
    dfs(0, 0, 0);
    cout << ans;
    return 0;
}

D souvneirs

题目:

思路:堆, 排序, 双指针,贪心,平衡树都可以做。把a放进小根堆里,b从小到大sort,如果满足条件b索引++,每次操作把堆顶pop掉...

这里有个小坑,在对vector排序如果没用到a[0],一定要从a.begin() + 1开始sort, 当然这里数都大于0,这个不影响

代码:

#include <bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n, m;
    cin >> n >> m;
    
    vector<int> a(n + 1);
    vector<int> b(m + 1);
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    for(int i = 1; i <= m; i ++ ) cin >> b[i];

    sort(b.begin(), b.end());
    priority_queue<int, vector<int>, greater<int>> q;
    for(int i = 1; i <= n; i ++ ) q.push(a[i]);

    long long ans = 0;
    int i = 1;
    while(q.size() && i <= m) {
        if(q.top() >= b[i]) {
            ans += q.top();
            i ++;
            q.pop();
        } else {
            q.pop();
        }
    }

    if(i == m + 1) cout << ans;
    else cout << -1;
    return 0;
}

E alphabet tiles

题目:

思路:一眼数位dp

关于 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) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值