首页 > 其他分享 >AtCoder Beginner Contest 358

AtCoder Beginner Contest 358

时间:2024-08-24 13:04:24浏览次数:10  
标签:AtCoder cout Beginner int ios long num 358 define

C - Popcorn

思路:从集合 S 中选出非空子集,使得子集中糖果口味有 M 种。观察到集合 S 中的元素数量 n<=10。因此,总共的子集数为 C<=2^10-1,考虑枚举所有的子集。

代码:

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define ios ios::sync_with_stdio(0)
#define endl '\n'
#define pii pair<int, int>
#define debug(x) cout << "x = " << x << endl;
#define lowbit(x) (x & (-x))
using namespace std;
const int N = 5e2 + 5, P = 13331;
int n, m, key;
int a[N];
bool vst[N];
bool dfs(int d, int x, int num, int last)
{
    if (d > x)
    {
        if (num == key)
            return true;
        else
            return false;
    }
    for (int i = last + 1; i <= n; i++)
    {
        if (vst[i])
            continue;
        vst[i] = 1;
        if (dfs(d + 1, x, num | a[i], i))
            return true;
        vst[i] = 0;
    }
    return false;
}
bool check(int x)
{
    memset(vst, 0, sizeof(vst));
    return dfs(1, x, 0, 0);
}
void solve()
{
    int T = 1;
    // cin>>T;
    while (T--)
    {
        cin >> n >> m;
        key = (1 << m) - 1;
        string s;
        for (int i = 1; i <= n; i++)
        {
            cin >> s;
            int num = 0;
            for (int j = 0; j < s.size(); j++)
            {
                if (s[j] == 'o')
                    num = num | (1 << j);
            }
            a[i] = num;
        }
        int l = 0, r = n + 1;
        while (l + 1 < r)
        {
            int mid = (l + r) / 2;
            if (check(mid))
                r = mid;
            else
                l = mid;
        }
        cout << r;
    }
}
signed main()
{
    ios;
    solve();
    return 0;
}

D - Souvenirs

思路:对于每一个 Bi,我们可以贪心的去找最接近 BiAj,且满足 Aj>= Bi。这一操作我们可以利用二分在 logn 内完成。同时,题目要求不允许给一个人多个盒子,也不允许给多个人同一个盒子。因此,我们还需要在 logn 的时间复杂度内删除 Aj。使用multiset维护即可。

代码:

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define ios ios::sync_with_stdio(0)
#define endl '\n'
#define pii pair<int, int>
#define debug(x) cout << "x = " << x << endl;
#define lowbit(x) (x & (-x))
using namespace std;
const int N = 5e5 + 5, P = 13331;
int n, m;
multiset<int> st;
void solve()
{
    int T = 1;
    // cin>>T;
    while (T--)
    {
        cin >> n >> m;
        for (int i = 1,x; i <= n; i ++)
        {
            cin >> x;
            st.emplace(x);
        }
        int cost = 0;
        for (int i = 1, x; i <= m; i ++)
        {
            cin >> x;
            auto it = st.lower_bound(x);
            if(it == st.end())
            {
                cout << -1;
                return;
            }
            cost += *it;
            st.erase(it);
        }
        cout << cost;
    }
}
signed main()
{
    ios;
    solve();
    return 0;
}

E - Alphabet Tiles

思路:观察到这是一道计数题,计数题通常解法为组合数学和动态规划,可以发现本题的数据规模较小。因此,考虑动态规划。不难发现,这其实是一道分组背包的变形,我们令 DPi,j  表示前 i 组中,选用 j 个字母的方案数。转移方程为 :

\[dp(i,j) = \sum_{k=0}^j(dp(i-1,j-k)*C_j^k) \]

代码:

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define ios ios::sync_with_stdio(0)
#define endl '\n'
#define pii pair<int, int>
#define debug(x) cout << "x = " << x << endl;
#define lowbit(x) (x & (-x))
using namespace std;
const int N = 1e3 + 5, P = 998244353;
int k, c[N];
int f[N][N], dp[N][N];
void solve()
{
    int T = 1;
    // cin>>T;
    while (T--)
    {
        cin >> k;
        for (int i = 1; i <= 26; i++)
        {
            cin >> c[i];
        }
        f[0][0] = dp[0][0] = 1;
        for (int i = 1; i <= k; i++)
        {
            f[i][0] = 1;
            for (int j = 1; j <= i; j++)
            {
                f[i][j] = (f[i - 1][j] + f[i - 1][j - 1]) % P;
            }
        }
        for (int i = 1; i <= 26; i++)
        {
            for (int j = 0; j <= k; j++)
            {
                for (int z = 0; z <= j && z <= c[i]; z++)
                {
                    dp[i][j] = (dp[i][j] + dp[i - 1][j - z] * f[j][z]) % P;
                }
            }
        }
        int ans = 0;
        for (int i = 1; i <= k; i++)
        {
            ans = (ans + dp[26][i]) % P;
        }
        cout << ans << endl;
    }
}
signed main()
{
    ios;
    solve();
    return 0;
}

标签:AtCoder,cout,Beginner,int,ios,long,num,358,define
From: https://www.cnblogs.com/zc-study-xcu/p/18377656

相关文章

  • AtCoder Beginner Contest 050
    基本上独立做出来了。A-AdditionandSubtractionEasy模拟。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); intA,B; charC; cin>>A>>C>>B; if(C==......
  • RK3588 HDMI IN调试
    HDMIRX控制器配置:/*Shouldworkwithatleast128MBcmareservedabove.*/&hdmirx_ctrler{status="okay";/*EffectivelevelusedtotriggerHPD:0-low,1-high*/hpd-trigger-level=<1>;hdmir......
  • RK3588添加支持RS485收发
    RS485是在串口基础上利用电平转换芯片,将TTL电平转换成485的差分信号,电路图如下:RO: 接收器输出----接RXRE: 接收器输出使能(低电平-接收使能)DE: 驱动器输出使能(高电平-发送使能)DI: 驱动器输入----接TX在传输数据时候需要将RS485RE置高,发送使能,接收禁止;发送完数据以后需要将RS......
  • AtCoder Beginner Contest 中的小思维题
    078Dhttps://atcoder.jp/contests/abc078/tasks/arc085_b问题陈述我们有一副由\(N\)张牌组成的扑克牌。每张牌上都写着一个整数。从最上面开始的第\(i\)张牌上的整数是\(a_i\)。两个人X和Y将用这副扑克牌玩一个游戏。最初,X手中有一张写有\(Z\)的牌,Y手中有一张......
  • AtCoder Beginner Contest 048
    A-AtCoder***Contest先输出首字母,然后遍历字符串,遇到空格就输出后面的第一个字符。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); strings; getline(cin,s); cout<<s[0];......
  • Atcoder Beginner Contest 365
    AtcoderBeginnerContest365A题意输入年份,输出该年份天数。思路略B题意输入一个序列,输出该序列次大值的位置。思路略C题意给定\(N\),序列\(A\)和\(M\)。求满足下条件的\(x\)最大值。\[\sum_{i=1}^{n}\min(x,A_i)\leM\]思路式子左边有单调性,二分\(x\)......
  • RK3588开发笔记-pdm接口ES7201音频采集调试记录
    目录​​​​​​​前言一、ES7201技术规格二、PDM接口说明RK3588的PDM接口特性三、原理图连接四、内核配置五、音频调试总结前言        在RK3588开发过程中,音频采集是一个常见的需求,而PDM(PulseDensityModulation)接口因其简单性和低成本广泛应用......
  • AtCoder Beginner Contest 047
    A-FightingoverCandies简单排序。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); vector<int>a(3); cin>>a[0]>>a[1]>>a[2]; sort(a.begi......
  • AtCoder Beginner Contest 367
    A-ShoutEveryday思路:水题一道,模拟即可。B-Cut.0思路:直接cin和cout即可,c++输入输出性质。C-EnumerateSequences思路:注意到数据范围很小,因此考虑到搜素所有的序列,然后判断是否合法。D-Pedometer思路:观察到是环上问题,先断环为链,观察题目,可以发现,对于s,它的终......
  • AtCoder Beginner Contest 046
    A-AtCoDeerandPaintCans#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); set<int>s; for(inti=0;i<3;i++){ intx; cin>>x; s.inser......