zoukankan      html  css  js  c++  java
  • 2019黑龙江省大学生程序设计竞赛 赛后总结

    赛后总结:

      T:今天比赛彭彭和金姐又来晚了。╭(╯^╰)╮然后我从最后开始看,最后一题又是熟悉的序列交换成有序数列,然后套一下我们的模板,然后就拿到首A了。接着跟榜看A题,花了几分钟搞一搞,然后因为爆int挖了一发,痛苦,以后要仔细看数据范围啊。然后金姐和彭彭看了E题做出来了,然后金姐看H题,听隔壁队伍口胡了快半小时。。。笑死我了。然后比他们先做出来了。最后我在看B题,组合数学题,不知道怎么处理大数阶乘,用java搞出来解,但是因为复杂度的问题,wa了,最后金姐和彭彭莫名其妙搞出了G题。太强了啊。如果会做更多组合数学题就好了呜呜。

          P:E题是一道水题,然而打的时候还是不必要的WA了一次(傻的判断条件写错了。。还自己没找到,金姐看到的)。G题首先的想法以为只会有两种不同的数字,然而思路是错的,被金姐推翻。后来。。就跟这道题杠上了,然后突发奇想,逆向思维向上推,受金姐启发,在思路不完全清晰的情况下,找到了能够应征大家之前所有例子的正确解,然后金姐就打了,就A了之后都还不是特别明白为什么。直到结束,问了隔壁队。

      J:H题也是一道水题,但是刚开始样例没看懂,结果听隔壁队口胡,突然就看懂了,但是后来想复杂了,想到万一水不够木块浮起来怎么办,把隔壁队也给带歪了,最后看到A了那么多人,应该没那么复杂,就A了

    题解:

    A - A Count Task

     HDU - 6480 

    简单字符串题

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<string>
    #include<vector>
    #include<ctime>
    #include<map>
    #include<unordered_map>
    #include<time.h>
    #include<random>
    #include<stack>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    #define mm(a,b) memset(a,b,sizeof(a))
    const int maxn = 1e6 + 50;
    #define MAXN 1100
    #define mod 100000007
    const double eps = 1e-5;
    int main()
    {
        int T;
        scanf("%d", &T);
        while (T--)
        {
            string a;
            cin >> a;
            ll ans = 0;
            for (int i = 0; i < a.length(); )
            {
                ll count = 1;
                char now = a[i];
                for (int j = i + 1; j < a.length(); j++)
                {
                    if (a[j] == now) count++;
                    else break;
                }
                i += count;
                //if (count > 1)
                {
                    ans += ((count + 1)*count) / 2;
                }
            }
            printf("%lld
    ", ans);
        }
        return 0;
    }

    E - A Hard Allocation

     HDU - 6484 

    题解:最优的解法是将蛋糕均分给大家,直到没有蛋糕,如果蛋糕是人数的倍数就是差值为0,否则差值为1

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<queue>
     7 #include<set>
     8 #include<string>
     9 #include<vector>
    10 #include<ctime>
    11 #include<map>
    12 #include<unordered_map>
    13 #include<time.h>
    14 #include<random>
    15 #include<stack>
    16 #include<cstdlib>
    17 using namespace std;
    18 typedef long long ll;
    19 #define mm(a,b) memset(a,b,sizeof(a))
    20 const int maxn = 1e6 + 50;
    21 #define MAXN 1100
    22 #define mod 100000007
    23 const double eps = 1e-5;
    24 int main()
    25 {
    26     int T;
    27     scanf("%d", &T);
    28     while (T--)
    29     {
    30         int n, m;
    31         scanf("%d %d", &n, &m);
    32         if (n%m==0)
    33             printf("0
    ");
    34         else
    35             printf("1
    ");
    36     }
    37     return 0;
    38 }
    View Code

    G - Flower

     HDU - 6486 

    题解:题目要求的是,能否将所有花砍刀一样高,如果可以,最少需要砍的次数是几次。

    由于,每砍一次,需要砍n-1朵花,因此这就相当于将n朵中的其中一朵给它增加1的高度。因此,这道题目就可以演变成问你加多少次能使花的高度一样。因为,每次只能增加一朵花的1高度,因此增加的次数就是将n朵花中最高的那朵与其他的花的差值的和。此时,还需要考虑,n朵花是否有足够的高度让我们砍那么多次和砍那么多次,是否能得到平均的高度。

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<queue>
     7 #include<set>
     8 #include<string>
     9 #include<vector>
    10 #include<ctime>
    11 #include<stack>
    12 using namespace std;
    13 typedef long long ll;
    14 #define mm(a,b) memset(a,b,sizeof(a))
    15 #define MAXN 100010
    16 #define inf 0x3f3f3f3f
    17 int n, a[MAXN];
    18 int main()
    19 {
    20     int t;
    21     ll sum;
    22     ll ans;
    23     scanf("%d", &t);
    24     while (t--)
    25     {
    26         sum = 0;
    27         ans = 0;
    28         scanf("%d", &n);
    29         for (int i = 0; i < n; ++i)
    30         {
    31             scanf("%d", &a[i]);
    32             sum += a[i];
    33         }
    34         sort(a, a + n);
    35         for (int i = 0; i < n; ++i)
    36             ans += a[n - 1] - a[i];
    37         if ((sum - ans * (n - 1)) % n || (sum - ans * (n - 1)) / n <= 0)
    38             printf("-1
    ");
    39         else printf("%d
    ", ans);
    40     }
    41 }
    View Code

    H - Overflow

     HDU - 6487 

    题解,根据木块的密度,判断木块能不能浮起来,浮起来的话水增加的体积为L^3*P,否则谁增加的体积为L^3

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<string>
    #include<vector>
    #include<ctime>
    #include<map>
    #include<unordered_map>
    #include<time.h>
    #include<random>
    #include<stack>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    #define mm(a,b) memset(a,b,sizeof(a))
    const int maxn = 1e6 + 50;
    #define MAXN 10010
    #define mod 100000007
    const double eps = 1e-5;
    int main()
    {
        int t, n;
        double l[MAXN], p[MAXN], s, v, h;
        double sum = 0;
        scanf("%d", &t);
        while (t--)
        {
            scanf("%d", &n);
            sum = 0;
            for (int i = 0; i < n; ++i)
            {
                scanf("%lf%lf", &l[i], &p[i]);
                if (p[i] >= 1) sum += l[i] * l[i] * l[i];
                else sum += l[i] * l[i] * l[i] * p[i];
            }
            scanf("%lf%lf%lf", &s, &h, &v);
            sum += v;
            printf("%.2f
    ", min(h, sum / s));
        }
    }
    View Code

    J - The puzzle

     HDU - 6489 

    题解:把数列交换成升序序列最小交换次数。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<set>
    #include<string>
    #include<vector>
    #include<ctime>
    #include<map>
    #include<unordered_map>
    #include<time.h>
    #include<random>
    #include<stack>
    #include<cstdlib>
    using namespace std;
    typedef long long ll;
    #define mm(a,b) memset(a,b,sizeof(a))
    const int maxn = 1e6 + 50;
    #define MAXN 1100
    #define mod 100000007
    const double eps = 1e-5;
    int getMinSwaps(vector<int> &nums) {
        vector<int> nums1(nums);
        sort(nums1.begin(), nums1.end());
        unordered_map<int, int> m;
        int len = nums.size();
        for (int i = 0; i < len; i++) {
            m[nums1[i]] = i;
        }
        int loops = 0;
        vector<bool> flag(len, false);
        for (int i = 0; i < len; i++) {
            if (!flag[i]) {
                int j = i;
                while (!flag[j]) {
                    flag[j] = true;
                    j = m[nums[j]];
                }
                loops++;
            }
        }
        return len - loops;
    }
    int main()
    {
        int T;
        scanf("%d", &T);
        while (T--)
        {
            int n;
            vector<int>arr;
            scanf("%d", &n);
            for (int i = 0; i < n; i++)
            {
                int id;
                scanf("%d", &id);
                arr.push_back(id);
            }
            int ans = getMinSwaps(arr);
            printf("%d
    ", ans);
        }
    }
    View Code
  • 相关阅读:
    【Gym
    [matlab工具箱] 曲线拟合Curve Fitting
    数学建模 常用
    “这么多人给我作证,我不怕”
    超星尔雅刷课辅助
    细思《都挺好》
    P5173 传球
    [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones
    CF 1131C Birthday
    CF 634A Island Puzzle
  • 原文地址:https://www.cnblogs.com/Tangent-1231/p/10834399.html
Copyright © 2011-2022 走看看