zoukankan      html  css  js  c++  java
  • AtCoder Regular Contest 060

    C - 高橋君とカード / Tak and Cards

    思路:dp,先说说我想的,我写的dp数组是dp[i][j][k],表示从前i个数字中,选择j个数字,平均值为k,则dp[i][j][k] = dp[i-1][j][k]+dp[i-1][j-1][(j*k-nums[i])/(j-1)],即第i个选或者不选。不过错了。。。。标程给出的题解思路差不多,dp[i][j][k]表示前i个数字中选取j个数字,和为k。dp[i][j][k] = dp[i-1][j][k]+dp[i-1][j-1][k-nums[i]]。时间复杂度为O(n^4)

    #include <bits/stdc++.h>
    using namespace std;
     
    const int MAXN = 55;
    long long dp[MAXN][MAXN][MAXN*MAXN];
    int nums[MAXN];
    int n,a;
     
    int main()
    {
        scanf("%d %d",&n,&a);
        for(int i = 1; i <= n; ++i)
            scanf("%d",&nums[i]);
        dp[0][0][0] = 1;
        for(int i = 1; i <= n; ++i)
        {
            for(int j = 0; j <= i; ++j)
            {
                for(int k = 0; k <= n*50; ++k)
                {
                    if(k >= nums[i] && j > 0) dp[i][j][k] += (dp[i-1][j][k]+dp[i-1][j-1][k-nums[i]]);
                    else dp[i][j][k] += dp[i-1][j][k];
                }
            }
        }
        long long res = 0;
        for(int i = 1; i <= n; ++i)
            res += dp[n][i][i*a];
        printf("%lld
    ",res);
        return 0;
    }
    

    #### D - 桁和 / Digit Sum 思路:感觉这题思路就很新了,主要是因为没见过这种题。看数据范围是1e11,sqrt(n)的时间复杂度还是很好的。标程是把b分了两种情况来求解,一种是b<=sqrt(n),一种是b>sqrt(n)。当b<=sqrt(n)的时候,直接枚举即可。当b>sqrt(n)的时候,n=pb+q,因为这时b^2>n。考虑n的b进制表示为x2x1x0。则n=x0 + x1 * b + x2 * b^2,因为b^2>n,所以x2=0,所以这时候n = pb+q,则s=p+q。联立两式,得到n-s=p * (b-1)(标程中这里p和b写混了),然后枚举n-s的因子即可。 ```c++ #include using namespace std; typedef long long LL; const LL INF = 1e13; LL n,s,st,sum;

    void dfs(LL num, LL base)
    {
    if(num == 0) return;
    dfs(num/base,base);
    sum += num%base;
    }

    int main()
    {
    cin >> n >> s;
    if(s > n)
    {
    cout << -1 << endl;
    return 0;
    }
    if(s == n)
    {
    cout << s+1 << endl;
    return 0;
    }

    st = sqrt(n) + 1;
    for(LL i = 2; i <= st; ++i)
    {
        sum = 0;
        dfs(n,i);
        if(sum == s)
        {
            cout << i << endl;
            return 0;
        }
    }
    LL b,q,res = INF;
    n = n-s;
    for(LL i = 1; i*i <= n; ++i)
    {
        if(n%i == 0)
        {
            b = n/i+1;
            q = s-i;
            if(q >= 0 && b >= 2 && q < b && i < b)
                res = min(res,b);
        }
    }
    cout << (res==INF?-1:res) << endl;
    return 0;
    

    }

    <hr/>
    #### E - 高橋君とホテル / Tak and Hotels
    思路:首先呢,是想预处理每个点向右和向左最远能扩展的距离,想到这里,发现不会预处理,遂放弃。然后想以每个点为终点,计算出最左边起点到这个点的最短时间和最右边点到这个最短天数,发现这种情况下,不能保证a-b这一段中,a是作为起始点的,放弃。看题解。英文题解没看懂,把日文题解翻译成中文才看懂了。主要思路就是利用倍增的思想,处理出每个点向右或者向左在x天内最远能到达的距离。r[k][i]表示节点i在2^k天内最远能到达的点,r[k+1][i]=r[k][r[k][i]]。然后算天数就好了。
    ```c++
    #include <bits/stdc++.h>
    using namespace std;
    
    const int MAXN = 1e5+10;
    int dp[30][MAXN],x[MAXN],l,n;
    int q;
    
    int main()
    {
        int i,j;
        cin >> n;
        for(int i = 1; i <= n; ++i)
            cin >> x[i];
        cin >> l;
        for(int i = 1; i < n; ++i)
            dp[0][i] = upper_bound(x+1,x+n+1,x[i]+l) - x - 1;
        for(i = 1; i < 30; ++i)
        {
            for(j = 1; j <= n; ++j)
                dp[i][j] = dp[i-1][dp[i-1][j]];
        }
        cin >> q;
        int a,b,res;
        while(q--)
        {
            res = 0;
            cin >> a >> b;
            if(a > b) swap(a,b);
            for(i = 29; i >= 0; --i)
            {
                if(dp[i][a] == 0) continue;
                if(dp[i][a] < b)
                {
                    a = dp[i][a];
                    res += (1<<i);
                }
            }
            cout << res+1 << endl;
        }
        return 0;
    }
    
    

    #### F - 最良表現 / Best Representation 待补
  • 相关阅读:
    go标准库的学习-net/http
    go标准库的学习-sync互斥
    sqlplus命令大全
    Oracle 11g安装步骤详谈
    安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案(原创) (2016-10-29 下午01:56)
    Dos命令查看端口占用及关闭进程
    access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")
    Hibernate的集合映射与sort、order-by属性
    Hibernate总结2 API和配置文件
    MyEclipse8.5启动无法选择工作空间的问题
  • 原文地址:https://www.cnblogs.com/guoyongheng/p/7909403.html
Copyright © 2011-2022 走看看