首页 > 其他分享 >牛客周赛 Round 32

牛客周赛 Round 32

时间:2024-02-12 19:44:34浏览次数:31  
标签:int 32 ++ long 牛客 pair using Round define

牛客周赛 Round 32

小红的 01 背包

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    int a, b, c;
    cin >> a >> b >> c;
    cout << a / b * c << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

小红的 dfs

解题思路:

观察可知,一共只有三种情况。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    vector<string> g(4);
    for (int i = 1; i <= 3; i++)
    {
        cin >> g[i];
        g[i] = ' ' + g[i];
    }
    int a = 0;
    int b = 0;
    int c = 0;
    if (g[1][1] != 'd')
    {
        a++;
    }
    if (g[1][2] != 'f')
    {
        a++;
    }
    if (g[1][3] != 's')
    {
        a++;
    }
    if (g[2][1] != 'f')
    {
        a++;
    }
    if (g[3][1] != 's')
    {
        a++;
    }
    if (g[2][1] != 'd')
    {
        b++;
    }
    if (g[2][2] != 'f')
    {
        b++;
    }
    if (g[2][3] != 's')
    {
        b++;
    }
    if (g[1][2] != 'd')
    {
        b++;
    }
    if (g[3][2] != 's')
    {
        b++;
    }
    if (g[3][1] != 'd')
    {
        c++;
    }
    if (g[3][2] != 'f')
    {
        c++;
    }
    if (g[3][3] != 's')
    {
        c++;
    }
    if (g[1][3] != 'd')
    {
        c++;
    }
    if (g[2][3] != 'f')
    {
        c++;
    }
    int ans = min(a, min(b, c));
    cout << ans << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

小红的排列生成

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    int n;
    cin >> n;
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    sort(a.begin() + 1, a.end());
    ll ans = 0;
    for (int i = 1; i <= n; i++)
    {
        ans += abs(a[i] - i);
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

小红的二进制树

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
const int N = 1e5 + 10;
vector<int> e[N];
int w[N];
int f[N];

void dfs(int u, int fa)
{
    f[u] = w[u];
    for (auto v : e[u])
    {
        if (v == fa)
        {
            continue;
        }
        dfs(v, u);
        f[u] += f[v];
    }
}

void solve()
{
    int n;
    cin >> n;
    string s;
    cin >> s;
    for (int i = 0; i < n; i++)
    {
        w[i + 1] = s[i] - '0';
    }
    for (int i = 1; i < n; i++)
    {
        int a, b;
        cin >> a >> b;
        e[a].push_back(b);
    }
    dfs(1, -1);
    for (int i = 1; i <= n; i++)
    {
        cout << f[i] - w[i] << endl;
    }
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

小红的回文数

解题思路:

回文数特性:最多只有一个数字出现个数是奇数。

\(0\sim 9共10个数字在每个数位上如果是奇数就是1,否则就是0,压缩组成的10进制数。i\in [0,2^{10}])\)

\(dp[i]:前缀中为i的状态有多少个\)

对于当前状态\(cur\),如果前缀和状态也为\(cur\),说明从该前缀到当前为止中,所有数字的个数都是偶数个。

对于当前状态\(cur\),如果前缀和状态与当前状态只有一个数位不同,说明从该前缀到当前为止中,只有一个数字的个数是奇数个。

上述两种状况能与当前状态构成好整数。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
const int N = 1ll << 11;
int dp[N];
void solve()
{
    string s;
    cin >> s;
    int cur = 0;
    dp[cur] = 1;
    ll ans = 0;
    for (int i = 0; i < s.size(); i++)
    {
        cur ^= 1 << (s[i] - '0');
        ans += dp[cur];
        for (int j = 0; j < 10; j++)
        {
            int t = cur;
            t ^= 1 << j;
            ans += dp[t];
        }
        dp[cur]++;
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

小红的矩阵修改

解题思路:

状态压缩\(dp\)。

\(dp[i][j]:考虑前i列,第i列为j时的合法方案的最小操作步数\)。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
const int N = 1010;
int dp[N][100];
int v[5][N];
bool valid[100];
int n, m;
int b[10];
bool check(int x)
{
    for (int i = 1; i <= n; i++, x /= 3)
    {
        b[i] = x % 3;
    }
    for (int i = 2; i <= n; i++)
    {
        if (b[i] == b[i - 1])
        {
            return false;
        }
    }
    return true;
}

bool check(int a, int b)
{
    for (int i = 1; i <= n; i++)
    {
        if (a % 3 == b % 3)
        {
            return false;
        }
        a /= 3;
        b /= 3;
    }
    return true;
}

void solve()
{
    memset(dp, 0x3f, sizeof dp);
    cin >> n >> m;
    int s = 1;
    for (int i = 1; i <= n; i++)
    {
        s *= 3;
    }
    vector<string> g(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> g[i];
        g[i] = ' ' + g[i];
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= m; j++)
        {
            if (g[i][j] == 'r')
            {
                v[i][j] = 0;
            }
            else if (g[i][j] == 'e')
            {
                v[i][j] = 1;
            }
            else
            {
                v[i][j] = 2;
            }
        }
    }
    ll ans = 1e18;
    for (int i = 1; i <= m; i++)
    {
        if (i == 1)
        {
            for (int j = 0; j < s; j++)
            {
                if (check(j))
                {
                    int cnt = 0;
                    for (int k = 1; k <= n; k++)
                    {
                        if (b[k] != v[k][i])
                        {
                            cnt++;
                        }
                    }
                    dp[i][j] = min(dp[i][j], cnt);
                }
            }
        }
        else
        {
            for (int j = 0; j < s; j++)
            {
                if (check(j))
                {
                    int cnt = 0;
                    for (int k = 1; k <= n; k++)
                    {
                        if (b[k] != v[k][i])
                        {
                            cnt++;
                        }
                    }
                    for (int k = 0; k < s; k++)
                    {
                        if (check(j, k))
                        {
                            dp[i][j] = min(dp[i][j], dp[i - 1][k] + cnt);
                        }
                    }
                }
            }
        }
    }
    for (int i = 0; i < s; i++)
    {
        ans = min(ans, (ll)dp[m][i]);
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    // cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

标签:int,32,++,long,牛客,pair,using,Round,define
From: https://www.cnblogs.com/value0/p/18014069

相关文章

  • 2024牛客寒假算法基础集训营2个人补题题解(K、D)
    比赛链接:2024牛客寒假算法基础集训营2K、TokitsukazeandPassword(easy)题面看着很难实际上只要暴力的东西,赛时看了眼题面就溜了血亏爆搜,枚举\(abcd\)和_可能的值,枚举的情况只有\(9*8*7*6*9=27216\)种。判断按照枚举出的对应值排列出的密码是否满足条件,满足就\(ans++\)写完......
  • 牛客2.7比赛E,F题
    链接:https://ac.nowcoder.com/acm/contest/67743/E来源:牛客网智乃最近学习了冒泡排序和最长子段和,所以她现在想把它们合并成一个新的算法。众所周知,冒泡排序是一种通过交换相邻元素实现排序的算法,最长子段和是指从一个数组aaa中取出一段连续的非空数组区间[l,r][l,r][l,r],最大......
  • Codeforces Round 924 (Div. 2)
    E-ModularSequence题意给定\(n,x,y,s\),求是否有长为\(n\)的一个数列\(\{a\}\)满足\(a_1=x\)且\(\foralli>1:a_i=a_{i-1}+y\lora_i=a_{i-1}\bmody\)且\(\sum\limits_{i=1}^{n}a_i=s\)。\(\sumn,\sums\le2\times10......
  • Codeforces Round 924 (Div. 2)
    不会F的场。ACode#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){ ios::sync_with_stdio(false); cin.tie(0); intt; cin>>t; while(t--){ inta,b; cin>>a>>b; intf=0; if(a%2==0&&am......
  • Codeforces Round 924 (Div. 2)
    CodeforcesRound924(Div.2)A-RectangleCutting解题思路:初始矩形长宽为\((a,b)\),如果我们切\(a\),那么一定不能再拼接\(a\),否则一定一样。所以我们拼接\(b\),即将\(a\)对半分开得到两个\((\frac{a}{2},b)\)矩形拼接。此时,如果\(\frac{a}{2}=b\)那么拼接出来的矩形和初......
  • Codeforces Round 905 (Div. 3)
    题目链接A.先算距离,特判0的位置,最后加4#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){strings;cin>>s;s=""+s;intlast=1,now,ans=0;for(inti=1;i<s.si......
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)
    目录题目链接题意题解代码题目链接C.DigitalLogarithm题意给两个长度位\(n\)的数组\(a\)、\(b\),一个操作\(f\)定义操作\(f\)为,\(a[i]=f(a[i])=a[i]\)的位数求最少多少次操作可以使\(a、b\)两个数组变得完全相同题解性质:对于任何数,经过两次操作我们一定可以让其变为\(......
  • 2024牛客寒假算法基础集训营2 补题
    2024牛客寒假算法基础集训营2补题A.TokitsukazeandBracelet签到模拟参考代码:#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#defineebemplace_back#defineall(u)u.begin(),u.end()#defineendl'\n'#definedebug(x)cout......
  • stm32 esp8266测试问题原因记录
    现象:连上WIFI但发送数据失败 原因:WIFI网络延时过大,或者程序设置的等待超时时间过小解法:换个网络延时小的WIFI连,或者增加程序等待超时的时间 现象:连不上WIFI 原因:esp8266_mqtt_init()中的的延迟过长,测试4S不行,要2S解法:将4秒延时改回2S1int32_tesp8266_mqtt_init(v......
  • STM32超声波模块问题
    先写没问题用法,有问题的语法就不示范voidSr04_Init(void){GPIO_InitTypeDefGPIO_InitStruct;TIM_TimeBaseInitTypeDefTIM_TimeBaseInitStruct;//打开GPIO组时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);RCC_AHB1PeriphClockCm......