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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值