• [CodeForces]Codeforces Round #429 (Div. 2) ABC(待补)


    A. Generous Kefa

    题意

    已知$n$个气球要分给$k$个人,要求每个人分到的气球不存在颜色相同的,判断是否可行。

    题解

    统计同种颜色气球最多的数量,判断是否小于等于$n$即可。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e5+9;
    
    int main() {
        int n, k; cin >> n >> k;
        string s; cin >> s;
        int m = 0;
        for (char c = 'a'; c <= 'z'; c++) {
            int t = 0;
            for (int i = 0; i < s.size(); i++) if (s[i] == c) t++;
            m = max(m, t);
        }
        if (m > k) return 0 * printf("NO
    "); 
        else return 0 * printf("YES
    ");
    }
    

    B. Godsend

    题意

    已知$n$个数,两个人分别取数,第一个人只能取连续的和为奇数的数,第二个人只能取连续的和为偶数的数,取走后剩下的数合并成一个新的数列。当某个人无法取数时,另外一个人获胜。判断谁将获胜。

    题解

    推理一下:假如一堆数和为奇数,第一个人直接都拿走就赢了;假如一堆数和为偶数,如果存在一个数为奇数,那么第一个人就拿走它,剩下的数的和一定也为奇数,则第二个人只能拿走和为偶数的,再剩下奇数的还是第一个人赢。
    于是结论就是——若存在奇数,则第一个人赢,否则第二个人赢。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e6+9;
    
    int a[N];
    
    int main() {
        int n; cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i];
        for (int i = 1; i <= n; i++) if (a[i] & 1) return 0 * printf("First
    ");
        return 0 * printf("Second
    ");
    }
    

    C. Journey

    题意

    给定一个函数$F(n,k)$表示$inom{n}{k}$个组合中最小元素的期望,给定两个都含有$m$个元素的数组$A$和$B$,重新确定$A$的顺序,使得$sum_{i=1}^{m} F(A'_i,B_i)$的值最大。

    题解

    贪心。根据样例我们猜测给两个数组排序之后最大对应最小这样排列的结果是最优,写了一发交上去过了。赛后想证明一下,过程如下:
    首先我们根据定义,得:$F(n,k)=frac{sum_{i=1}^{n-k+1}i imesinom{n-i}{k-1}}{inom{n}{k}}$。
    再由$Hockey Stick Theorem: sum_{i=0}^{k-1} inom{n+i}{i}=inom{k+n}{k-1}$,可以化简上式:$F(n,k)=frac{n+1}{k+1}$。
    $PS:$ 其实还可以这样考虑:我们从${0,1,2,...,n}$中取$k+1$个数后再去掉最小的那个数,也能得到$n$个数中选$k$个的组合,但是会有重复,并且每个组合重复的次数就等于其中最小元素出现的次数,即$F(n,k)=frac{inom{n+1}{k+1}}{inom{n}{k}}=frac{n+1}{k+1}$。
    最后我们的任务就是使$sum_{i=1}^{m} F(A_i,B_i)=sum_{i=1}^{m}frac{A_i+1}{B_i+1}$最大,根据排序不等式结论显然成立。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    
    const int N = 2e5+9;
    
    struct Num {
        int v, id;
    } a[N], b[N];
    
    int res[N];
    
    inline int read() {
        int s = 1, x = 0; char ch = getchar();
        while (ch < '0' || ch > '9') {if (ch == '-') s = -1; ch = getchar();}
        while (ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar();}
        return s * x;
    }
    
    inline bool cmpa(Num i, Num j) {
        return i.v > j.v;
    }
    
    inline bool cmpb(Num i, Num j) {
        return i.v < j.v;
    }
    
    int main() {
        int n = read();
        for (int i = 1; i <= n; i++) a[i].v = read(), a[i].id = i;
        for (int i = 1; i <= n; i++) b[i].v = read(), b[i].id = i;
        sort(a + 1, a + n + 1, cmpa);
        sort(b + 1, b + n + 1, cmpb);
        for (int i = 1; i <= n; i++) res[ b[i].id ] = a[i].v;
        for (int i = 1; i < n; i++) printf("%d ", res[i]);
        return 0 * printf("%d
    ", res[n]);
    }
    

    D. Leha and another game about graph

    题意

    已知$n$个顶点$m$条边的图,每个顶点有一个权值$d_i=0,1,-1$,求如何删除一个边集,使得$d_i=0$的顶点度数为偶数,$d_i=1$的顶点度数为奇数,$d_i=-1$的顶点度数奇偶不限。

    题解

    $DFS$。

    代码

    
    

    E. On the Bench

    题意

    已知$n$个数,求满足任意相邻两数乘积不是完全平方数的排列的个数对$10^9+7$取模。

    题解

    $dp$。

    代码

    
    
  • 相关阅读:
    Java学习之Java历史版本
    小数的二进制转换
    cpp反汇编调试一
    理解 typedef 定义的函数指针
    mov 与 lea 区别
    asmlinkage的用法
    秒的换算:ms(毫秒),μs(微秒),ns(纳秒),ps(皮秒)
    Java字节码例子解析
    Go程序的一生是怎样的?
    Linux内核 hlist_head/hlist_node结构解析
  • 原文地址:https://www.cnblogs.com/jstztzy/p/7401989.html
Copyright © 2020-2023  润新知