zoukankan      html  css  js  c++  java
  • Codeforces Round #475 Div. 2 A B C D

    A - Splits

    题意

    将一个正整数拆分成若干个正整数的和,从大到小排下来,与第一个数字相同的数字的个数为这个拆分的权重。

    (n)的所有拆分的不同权重可能个数。

    思路

    全拆成1,然后每次将2个1换成1个2,即每次2的个数增加1。

    共有1+n/2种。

    Code

    #include <bits/stdc++.h>
    #define F(i, a, b) for (int i = (a); i < (b); ++i)
    #define F2(i, a, b) for (int i = (a); i <= (b); ++i)
    #define dF(i, a, b) for (int i = (a); i > (b); --i)
    #define dF2(i, a, b) for (int i = (a); i >= (b); --i)
    using namespace std;
    typedef long long LL;
    int main() {
        int n;
        scanf("%d", &n);
        printf("%d
    ", n/2+1);
        return 0;
    }
    
    
    

    B - Messages

    题意

    收到报文的时刻报文价值为A,之后每秒其价值减少B。在某个时刻读某个报文即能得到该报文此时的价值;此外,每秒能获得的固定收益为当前报文数*C.

    问最大收益。

    思路

    理解题意即可:每个报文的价值,即每秒减少B,增加C。

    因此只需比较B与C,如果B大,则所有报文都收到立即读;否则全都堆到最后读。

    Code

    #include <bits/stdc++.h>
    #define F(i, a, b) for (int i = (a); i < (b); ++i)
    #define F2(i, a, b) for (int i = (a); i <= (b); ++i)
    #define dF(i, a, b) for (int i = (a); i > (b); --i)
    #define dF2(i, a, b) for (int i = (a); i >= (b); --i)
    using namespace std;
    typedef long long LL;
    int main() {
        int n,a,b,c,T;
        scanf("%d%d%d%d%d",&n,&a,&b,&c,&T);
        int x, sum=0;
        F(i, 0, n) scanf("%d", &x), sum += x;
        LL ans = n*a;
        if (c>b) ans += 1LL*(c-b)*(n*T-sum);
        printf("%d
    ", ans);
        return 0;
    }
    

    C - Alternating Sum

    题意

    计算(sum limits_{i=0}^{n} s_{i} a^{n - i} b^{i}),其中系数(s)只取(pm1),且为周期函数,周期为(T=frac{n+1}{k}).

    思路

    即计算(sum limits_{i=0}^{k-1} s_{i} a^{n - i} b^{i}cdotfrac{q^{frac{n+1}{k}}-1}{q-1}),注意特判(q=1).

    Code

    #include <bits/stdc++.h>
    #define F(i, a, b) for (int i = (a); i < (b); ++i)
    #define F2(i, a, b) for (int i = (a); i <= (b); ++i)
    #define dF(i, a, b) for (int i = (a); i > (b); --i)
    #define dF2(i, a, b) for (int i = (a); i >= (b); --i)
    using namespace std;
    typedef long long LL;
    const LL mod = 1e9+9;
    LL poww(LL a, LL b) {
        LL ret = 1;
        while (b) {
            if (b & 1) (ret *= a) %= mod;
            (a *= a) %= mod;
            b >>= 1;
        }
        return ret;
    }
    inline LL mul(LL a, LL b) { return a * b % mod; }
    inline LL add(LL a, LL b) { return (a+b+mod) % mod; }
    #define maxn 100010
    char s[maxn];
    int main() {
        int n, a, b, k;
        scanf("%d%d%d%d", &n, &a, &b, &k);
        scanf("%s", s);
        LL aa = poww(a, n), bb = 1, inva = poww(a, mod-2), ans = 0;
        F(i, 0, k) {
            int sign = s[i]=='+' ? 1 : -1;
            ans = add(ans, sign*mul(aa, bb));
            aa = mul(aa, inva);
            bb = mul(bb, b);
        }
        LL q = mul(poww(b, k), poww(inva, k));
        int cnt = (n+1) / k;
        if (q == 1) ans = mul(ans, cnt);
        else ans = mul(ans, mul(poww(q, cnt)-1, poww(q-1, mod-2)));
        printf("%I64d
    ", ans);
        return 0;
    }
    
    

    D - Destruction of a Tree

    题意

    在树上删点,当且仅当该点的度数为偶数时才能删去,问能否删完图中所有点,并要求给出操作序列。

    思路

    从叶子开始从下往上考虑,显然叶子不能直接删,要删叶子必然要在删去其父亲节点之后进行。

    而其父亲能不能直接删呢?如果其有奇数个孩子(未被删去的),则可以直接删去该节点(因其关联的边为连向其奇数个孩子+其父亲的共偶数条边),然后再向下删去之前未删去的部分;否则,其的删除工作必然要留到其父亲被删除之后才能进行。(注意,叶子节点也是符合这个特性的,因为叶子节点的孩子数0为偶数)

    因此,dfs,从下往上考虑每个节点有多少个孩子未被删去;若为奇数个,则可删去该节点(并一路往下删孩子),并且忽略该节点对其父亲节点度数的贡献;否则,继续一路向上。

    Code

    #include <bits/stdc++.h>
    #define F(i, a, b) for (int i = (a); i < (b); ++i)
    #define F2(i, a, b) for (int i = (a); i <= (b); ++i)
    #define dF(i, a, b) for (int i = (a); i > (b); --i)
    #define dF2(i, a, b) for (int i = (a); i >= (b); --i)
    #define maxn 200010
    using namespace std;
    typedef long long LL;
    struct Edge {
        int to, ne;
    }edge[maxn<<1];
    int ne[maxn], tot, rt;
    bool flag[maxn];
    vector<int> ans;
    void add(int u, int v) {
        edge[tot] = {v, ne[u]};
        ne[u] = tot++;
    }
    void collect(int u, int fa) {
        ans.push_back(u);
        flag[u] = true;
        for (int i = ne[u]; ~i; i = edge[i].ne) {
            int v = edge[i].to;
            if (v == fa || flag[v]) continue;
            collect(v, u);
        }
    }
    int dfs(int u, int fa) {
        int tot = 0;
        for (int i = ne[u]; ~i; i = edge[i].ne) {
            int v = edge[i].to;
            if (v == fa) continue;
            tot += dfs(v, u);
        }
        if ((u==rt&&!(tot&1)) || (u!=rt&&tot&1)) collect(u, fa);
        return !(tot&1);
    }
    int main() {
        memset(ne, -1, sizeof ne);
        int n, x;
        scanf("%d", &n);
        F2(i, 1, n) {
            scanf("%d", &x);
            if (!x) rt = i;
            else add(i, x), add(x, i);
        }
        if (dfs(rt, -1)) {
            puts("YES");
            for (auto x : ans) printf("%d
    ", x);
        }
        else puts("NO");
        return 0;
    }
    
    
  • 相关阅读:
    html iframe 滚动条
    Angular-Ant Desigin 开篇
    端口访问不了的原因
    swift 加载 本地html 和 网络路径
    xcode9.4 报错 error:The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.
    viewDidLoad, viewWillDisappear, viewWillAppear等区别及各自的加载顺序
    JavaScript设计模式之一Interface接口
    ES6原生Class
    react portals
    react-native-pushy 热更新
  • 原文地址:https://www.cnblogs.com/kkkkahlua/p/8970242.html
Copyright © 2011-2022 走看看