美文网首页
【Codeforces】Codeforces Round #53

【Codeforces】Codeforces Round #53

作者: Caproner | 来源:发表于2019-01-17 15:40 被阅读0次

    Problem A

    枚举所有可能的情况(枚举坐标对k取余的结果),然后全部算出来取最大值即可。

    时间复杂度为O(nk)

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    int a[105], sum;
    
    int main()
    {
        int n, k;
        while(~scanf("%d%d", &n, &k))
        {
            memset(a, 0, sizeof(a));
            sum = 0;
            for(int i = 0; i < n; i++)
            {
                scanf("%d", &a[i]);
            }
            int ans = 0;
            for(int i = 0; i < k; i++)
            {
                int e = 0, s = 0;
                for(int j = 0; j < n; j++)
                {
                    if(j % k == i)
                    {
                        continue;
                    }
                    if(a[j] == 1)
                    {
                        e++;
                    }
                    else
                    {
                        s++;
                    }
                }
                ans = max(ans, abs(e - s));
            }
            printf("%d\n", ans);
        }
        return 0;
    }
    

    Problem B

    定义两个计数表:

    • 统计当前数字i一共有多少个的cnt[i]
    • 统计当前cnt中值至少为i的个数的dcnt[i]

    然后逐个读输入并更新这两个表,一旦有一个dcnt达到n了,就表明集齐了一套题。

    时间复杂度为O(n+m)

    #include <cstdio>
    #include <cstring>
    #include <map>
    
    using namespace std;
    
    int cnt[100005], dcnt[100005];
    
    int main()
    {
        int n, m;
        while(~scanf("%d%d", &n, &m))
        {
            memset(cnt, 0, sizeof(cnt));
            memset(dcnt, 0, sizeof(dcnt));
            int ans = 0;
            for(int i = 0; i < m; i++)
            {
                int a;
                scanf("%d", &a);
                cnt[a]++;
                dcnt[cnt[a]]++;
                if(dcnt[ans + 1] == n)
                {
                    ans++;
                    printf("1");
                }
                else
                {
                    printf("0");
                }
            }
            printf("\n");
        }
        return 0;
    }
    

    Problem C

    根据余弦定理可以得到方程:
    4R^2=2(r+R)^2-2(r+R)^2{\cos \theta}
    其中,\theta={\frac {2\pi} n}
    解方程就完事了。

    时间复杂度为O(1)

    #include <cstdio>
    #include <cmath>
    
    using namespace std;
    
    int main()
    {
        double n, r;
        while(~scanf("%lf%lf", &n, &r))
        {
            double theta = 2.0 * acos(-1.0) / n;
            double cosTheta = cos(theta);
    
            double A = 2.0 * (1.0 + cosTheta);
            double B = 4.0 * r * (cosTheta - 1.0);
            double C = 2.0 * r * r * (cosTheta - 1.0);
            double delta = B * B - 4.0 * A * C;
            double ans = (-1.0 * B + sqrt(delta)) / (2.0 * A);
    
            printf("%.7lf\n", ans);
        }
        return 0;
    }
    

    后续待补充

    相关文章

      网友评论

          本文标题:【Codeforces】Codeforces Round #53

          本文链接:https://www.haomeiwen.com/subject/awdidqtx.html