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

牛客周赛 Round 29

时间:2024-01-25 22:56:51浏览次数:42  
标签:int ll 29 long 牛客 solve using Round define

牛客周赛 Round 29

小红大战小紫

代码:

#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;

void solve()
{
    int a, b;
    cin >> a >> b;
    if (a > b)
    {
        puts("kou");
    }
    else if (a < b)
    {
        puts("yukari");
    }
    else
    {
        puts("draw");
    }
}

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;

void solve()
{
    int n;
    cin >> n;
    string a, b;
    cin >> a >> b;
    ll ans = 0;
    for (int i = 0; i < n; i++)
    {
        if (a[i] == 'Y')
        {
            ans += 2;
        }
        if (b[i] == 'Y')
        {
            if (a[i] == 'N')
            {
                ans += 2;
            }
            else
            {
                ans += 1;
            }
        }
    }
    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;

void solve()
{
    string s;
    cin >> s;
    int n = s.size();
    string a = "xiao";
    string b = "hong";
    int idx = s.find(a);
    s.erase(idx, a.size());
    idx = s.find(b);
    s.insert(idx, a);
    cout << s << 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;

void solve()
{
    int n;
    cin >> n;
    vector<double> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    vector<double> b = a;
    sort(b.begin() + 1, b.end());
    for (int i = 1; i <= n; i++)
    {
        auto idx = lower_bound(b.begin() + 1, b.end(), a[i]) - b.begin();
        if (n & 1)
        {
            if (idx == (n + 1) / 2)
            {
                int l = (n + 1) / 2 - 1;
                int r = (n + 1) / 2 + 1;
                double ans = ((double)b[l] + b[r]) / 2;
                printf("%.1lf\n", ans);
            }
            else if (idx < (n + 1) / 2)
            {
                int l = (n + 1) / 2;
                int r = (n + 1) / 2 + 1;
                double ans = ((double)b[l] + b[r]) / 2;
                printf("%.1lf\n", ans);
            }
            else if (idx > (n + 1) / 2)
            {
                int l = (n + 1) / 2 - 1;
                int r = (n + 1) / 2;
                double ans = ((double)b[l] + b[r]) / 2;
                printf("%.1lf\n", ans);
            }
        }
        else
        {
            if (idx <= n / 2)
            {
                printf("%.1lf\n", b[n / 2 + 1]);
            }
            else
            {
                printf("%.1lf\n", b[n / 2]);
            }
        }
    }
}

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

    return 0;
}

小红构造数组

解题思路:

首先,\(1\)无法构造。

我们对每个数进行质因子分解。记录所有质因子之和为\(sum\),最大的质因子次数为\(mx\)。

对于\(sum\)为奇数的情况,若\(mx \geq \frac{sum}{2} + 1\),则无解,反之则有解。

对于\(sum\)为偶数的情况,若\(mx \geq \frac{sum}{2}\),则无解,反之则有解。

关于数组的构造:

创建一个空数组。

每次取当前次数最大的质因子加入队尾,然后取一个次数第二大的放到队尾。记得每加入一次,次数减一。

指导所有次数为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;
const int N = 5e6 + 10;
void solve()
{
    ll n;
    cin >> n;
    if (n == 1)
    {
        puts("-1");
        return;
    }
    vector<int> mp(N);
    vector<int> primes;
    auto sieve = [&](int n)
    {
        for (int i = 2; i <= n; i++)
        {
            if (!mp[i])
            {
                primes.push_back(i);
                mp[i] = i;
            }
            for (auto p : primes)
            {
                if (i * p > n)
                {
                    break;
                }
                mp[i * p] = i;
                if (i % p == 0)
                {
                    break;
                }
            }
        }
    };
    sieve(N - 5);
    ll x = n;
    ll mx = 0;
    ll s = 0;
    priority_queue<pii> q;
    for (auto i : primes)
    {
        if (x % i == 0)
        {
            ll cnt = 0;
            while (x % i == 0)
            {
                cnt++;
                x /= i;
                s++;
            }
            mx = max(mx, cnt);
            q.push({cnt, i});
        }
    }
    bool isp = true;
    for (int i = 2; i <= x / i; i++)
    {
        if (x % i == 0)
        {
            isp = false;
            break;
        }
    }
    if (x > 1 && isp)
    {
        s++;
        q.push({1, x});
    }
    if (s & 1)
    {
        if (mx <= s / 2 + 1)
        {
            cout << s << endl;
            while (q.size())
            {
                auto a = q.top();
                q.pop();
                a.fi--;
                cout << a.se << ' ';
                if (q.size())
                {
                    auto b = q.top();
                    q.pop();
                    b.fi--;
                    cout << b.se << ' ';
                    if (b.fi > 0)
                    {
                        q.push(b);
                    }
                }
                if (a.fi > 0)
                {
                    q.push(a);
                }
            }
        }
        else
        {
            puts("-1");
            return;
        }
    }
    else
    {
        if (mx <= s / 2)
        {
            cout << s << endl;
            while (q.size())
            {
                auto a = q.top();
                q.pop();
                a.fi--;
                cout << a.se << ' ';
                if (q.size())
                {
                    auto b = q.top();
                    q.pop();
                    b.fi--;
                    cout << b.se << ' ';
                    if (b.fi > 0)
                    {
                        q.push(b);
                    }
                }
                if (a.fi > 0)
                {
                    q.push(a);
                }
            }
        }
        else
        {
            puts("-1");
            return;
        }
    }
}

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

    return 0;
}

小红又战小紫

解题思路:

首先,如果此时没有包含两个石子的石子堆,那么当前为必胜状态。

\(g[i][j]:此时含有1个石子的石子堆有i个,含有2个石子的石子堆有j个\).

随机选择胜率转移:

\(g[i][j] = \frac{i}{i + j} \times (1 - g[i-1][j]) + \frac{j}{i + j} \times (1 - g[i + 1][j - 1])\)。

其中,\(\frac{i}{i + j}\)是选中含有\(1\)个石子的石子堆的概率,\(\frac{j}{i + j}\)是选中含有\(2\)个石子的石子堆的概率。

\(1 - g\),是因为如果我们走完当前这一步,那么下一步就是对手走,所以\(g\)在这里是对手的胜率。

与之对应,我们的胜率就是\(1 - g\)。

不难发现,上述转移方程对于维度\(i\)有加有减,不容易写递推式。\(ps:这里可以写记忆化搜索递归。\)

所以,我们修改状态定义:

\(f[i][j]:当前有i堆石子不为空,其中,含有2个石子的堆数为j。\)

由此可得状态转移方程为:

\(f[i][j] = \frac{i - j}{i} \times f[i-1][j] + \frac{j}{i} \times f[i][j - 1]\)。

代码:

#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;
const int mod = 1e9 + 7;

ll qmi(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = res * a % mod;
        }
        b >>= 1;
        a = a * a % mod;
    }
    return res;
}

ll inv(ll x)
{
    return qmi(x, mod - 2);
}

void solve()
{
    int n;
    cin >> n;
    vector<int> cnt(4);
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        cnt[x]++;
    }
    vector<vector<ll>> f(n + 1, vector<ll>(n + 1));
    double ans = 1;
    // 对于状态转移方程,最好定义到方便递推的顺序
    // 当然,又要减又要加的那种形式也可以写成记忆化搜索
    // 不为0的石子堆有i个
    for (int i = 1; i <= n; i++)
    {
        f[i][0] = 1;
        // 为2的石子堆有j个
        for (int j = 1; j <= i; j++)
        {
            f[i][j] = ((((((i - j) * inv(i) % mod) * (1 - f[i - 1][j]) % mod) + mod)) % mod + ((((j * inv(i) % mod) * (1 - f[i][j - 1]) % mod) + mod)) % mod) % mod;
            f[i][j] %= mod;
        }
    }
    cout << f[cnt[1] + cnt[2]][cnt[2]] << endl;
}

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

    return 0;
}

标签:int,ll,29,long,牛客,solve,using,Round,define
From: https://www.cnblogs.com/value0/p/17988366

相关文章

  • hey_left 17 Codeforces Round 817 (Div. 4)
    题目链接A.把标准字符串和输入字符串排序,看是否相等#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){intn;cin>>n;stringt;cin>>t;strings="Timur";sort(s.begin(),s.end());......
  • hey_left 16 Codeforces Round 827 (Div. 4)
    题目链接A.判最大的数是不是另外两个数的和#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){inta,b,c;cin>>a>>b>>c;cout<<(max({a,b,c})==a+b+c-max({a,b,c})?"YES":"......
  • 29虚函数-静态绑定-动态绑定
    虚函数-静态绑定-动态绑定如果类中定义了虚函数,那么编译阶段,编译器会给这个类类型产生一个唯一的vftable虚函数表,其中主要存储的是RTTI指针和虚函数的地址。程序运行时,每一张虚函数表都会加载到内存的.rodata只读数据区。一个类中定义了虚函数,那么这个类的对象,其运行时,内存中开......
  • Codeforces Round 920 (Div. 3)
    赛时过了A~E,表现分1738。感觉D~G都挺有意义拿出来说的。[D]VeryDifferentArray首先一个贪心的猜想是:如果A和B长度相同,那一个顺序一个逆序应该是最优的情况。思考下如何证明这个猜想。假如A和B的长度均为2,易证\(A_1\)<\(A_2\),\(B_1\)>\(B_2\)时最优......
  • Codeforces round 919 (div2)
    Problem-A-Codeforces暴力枚举就可以;#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;vector<int>a;intn;signedmain(){int_;cin>>_;while(_--){a.clear();cin>>n;......
  • hey_left 15 Codeforces Round 835 (Div. 4)
    题目链接A.总和-最小值-最大值即为中间数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){inta,b,c;cin>>a>>b>>c;cout<<a+b+c-min({a,b,c})-max({a,b,c})<<'\n';}signedmain(){io......
  • Codeforces Round 170 (Div. 1)A. Learning Languages并查集
    如果两个人会的语言中有共同语言那么他们之间就可以交流,并且如果a和b可以交流,b和c可以交流,那么a和c也可以交流,具有传递性,就容易联想到并查集,我们将人和语言看成元素,一个人会几种语言的话,就将这些语言和这个人所在的集合合并,最后求一下人一共在几个连通块中,连通块的个数-1就是答案,......
  • 代码随想录 day29 非递减子序列 全排列 全排列 II
    非递减子序列cpp就业还是太难了还是转java吧好歹这个对双非还友好一些尝试写java的第一天本题关键是理解非递减子序列判断条件需要额外一个数组记录当前元素是否在本树层使用过记录在这个数组就说明用过了全排列本题系统的演示了怎么写全排列和最基本的组合问题的......
  • AT_abc296_d
    题目大意现在有两个数\(n\)和\(m\),请问你是否可以构造出一个数\(x\),使得\(m\lex\),并且让\(x=a\timesb\left(1\lea,b\len\right)\)。思路我们可以枚举数\(a\),判断是否可以使得\(a\timesb=x\)。但是我们可以发现,这样是错误的,因为\(1\len,m\le10^{12}\),并且答案也......
  • 【题解 P3293】 美味
    [SCOI2016]美味题目描述一家餐厅有\(n\)道菜,编号\(1,2,\ldots,n\),大家对第\(i\)道菜的评价值为\(a_i\)。有\(m\)位顾客,第\(i\)位顾客的期望值为\(b_i\),而他的偏好值为\(x_i\)。因此,第\(i\)位顾客认为第\(j\)道菜的美味度为\(b_i\oplus(a_j+x_i)\),\(\opl......