• AtCoder Regular Contest 059


    C - いっしょ / Be Together

    数据比较小,暴力就挺好的。O(n^2)可过的好题

    #include <bits/stdc++.h>
    using namespace std;
     
    const int MAXN = 110;
    int nums[MAXN],n;
     
    int main()
    {
    	scanf("%d",&n);
    	for(int i = 0; i < n; ++i)
    		scanf("%d",&nums[i]);
        int res = 999999999,cost = 0;
        for(int i = -100; i <= 100; ++i)
        {
            cost = 0;
            for(int j = 0; j < n; ++j)
                cost += (nums[j]-i)*(nums[j]-i);
            res = min(res,cost);
        }
        printf("%d
    ",res);
    	return 0;
    }
    

    ####D - アンバランス / Unbalanced 也比较水。 思路:假设当前字符串长度为偶数,字符x占了一半,另一半是别的字符,用 * 代替,则字符相邻的方式有两种,x和 * 交错排列;或者x和 * 不交错排列,这种情况下至少有两个x挨着。在交错排列的情况下,若x占了一半以上的话,则必定至少有两个x是挨着的,有种抽屉原理的感觉。对于长度为奇数的情况,即len为奇数,则当x字符占了一半以上,x字符至少有len/2+1个,这种情况下,有两种排列的方式,即交错排列和不交错的排列,也就是至少有两个x是挨着的或者两个x隔着一个字符。

    综上,一个字符串的子串如果是不平衡的,则必定有某种字符两个挨在一块或者中间隔着一个。扫一遍判断下即可。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int MAXN = 1e5+10;
    char str[MAXN];
    int len;
    
    int main()
    {
        int s = -1, e = -1;
        scanf("%s",str);
        len = strlen(str);
        for(int i = 0; i < len-1; ++i)
        {
            if(str[i] == str[i+1])
            {
                s = i+1;
                e = i+2;
                break;
            }
            if(i+2 < len && str[i] == str[i+2])
            {
                s = i+1;
                e = i+3;
                break;
            }
        }
        printf("%d %d
    ",s,e);
        return 0;
    }
    

    ####E - キャンディーとN人の子供 / Children and Candies 感觉D和E的难度差距太大了,感觉一下子突然难了好多,可能是我dp太水了。 参考:http://kmjp.hatenablog.jp/entry/2016/08/13/1030 https://arc059.contest.atcoder.jp/submissions/1550056

    思路:dp[k][n]表示把n个糖果分给k个孩子所得到的x[i]^a[i]的乘积的加和,就是题目要求的那玩意,感觉还挺绕呢。dp[k-1][n-m]表示把n-m个糖果分给k-1个孩子得到的结果。也就是第k个孩子给了他m个糖果。先考虑A[i]==B[i]的情况,这时候dp[k][n] += dp[k-1][n-m] * (A[i]^m)。当A[i] != B[i]的时候,则dp[k][n] += dp[k-1][n-m] * (A[i]^m + (A[i]+1)^m + ... + B[i]^m)。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int MAXN = 405;
    const LL mod = 1e9+7;
    LL sum[MAXN];
    LL A[MAXN],B[MAXN];
    LL dp[MAXN][MAXN];
    LL N,C;
    
    LL calc(int a, int b)
    {
        memset(sum,0,sizeof(sum));
        for(int i = a; i <= b; ++i)
        {
            LL t = 1;
            for(int j = 0; j <= C; ++j)
            {
                sum[j] = sum[j]+t;
                sum[j] %= mod;
                t = t*i%mod;
            }
        }
    }
    
    int main()
    {
    	cin >> N >> C;
    	for(int i = 1; i <= N; ++i)
    		cin >> A[i];
    	for(int i = 1; i <= N; ++i)
    		cin >> B[i];
    	dp[0][0] = 1;
    	for(int i = 1; i <= N; ++i)
    	{
    	    calc(A[i],B[i]);//计算A[i]^m + (A[i]+1)^m + ... + B[i]^m
    		for(int j = 0; j <= C; ++j)
    			for(int k = 0; k <= j; ++k)
    				dp[i][j] = (dp[i][j] + dp[i-1][j-k]*sum[k])%mod;
    	}
    	cout << dp[N][C] << endl;
    	return 0;
    }
    
    
    

    ####F - バイナリハック / Unhappy Hacking 不会,E都吃力,F就不看了,题刷多了,回头再来一块搞F
  • 相关阅读:
    数据库隔离级别
    Mysql 命令详解
    Mysql 索引
    强化学习(四):蒙特卡洛方法
    强化学习(三):动态编程
    强化学习(二):马尔可夫决策过程
    强化学习(一): 引入
    自然语言处理(五)时下流行的生成模型
    论文选读三 QANet
    皮质学习 HTM 知多少
  • 原文地址:https://www.cnblogs.com/guoyongheng/p/7881550.html
Copyright © 2020-2023  润新知