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
#include
#include
#include
#include
#include
#include<set>
#include<string>
#include
#include
#include
#include
#include
#include
#include
#include
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\n", ans);
    }
    return 0;
}

 

E - A Hard Allocation

 HDU - 6484 

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

 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 6 #include
 7 #include<set>
 8 #include<string>
 9 #include
10 #include
11 #include
12 #include
13 #include
14 #include
15 #include
16 #include
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\n");
34         else
35             printf("1\n");
36     }
37     return 0;
38 }
View Code

 

 

G - Flower

 HDU - 6486 

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

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

 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 6 #include
 7 #include<set>
 8 #include<string>
 9 #include
10 #include
11 #include
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\n");
39         else printf("%d\n", ans);
40     }
41 }
View Code

 

 

H - Overflow

 HDU - 6487 

 

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

#include
#include
#include
#include
#include
#include
#include<set>
#include<string>
#include
#include
#include
#include
#include
#include
#include
#include
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\n", min(h, sum / s));
    }
}
View Code

 

 

J - The puzzle

 HDU - 6489 

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

#include
#include
#include
#include
#include
#include
#include<set>
#include<string>
#include
#include
#include
#include
#include
#include
#include
#include
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\n", ans);
    }
}
View Code

 

转载于:https://www.cnblogs.com/Tangent-1231/p/10834399.html

你可能感兴趣的:(2019黑龙江省大学生程序设计竞赛 赛后总结)