2019黑龙江省大学生程序设计竞赛 赛后总结

2019黑龙江省大学生程序设计竞赛 赛后总结

赛后总结:

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

 

 

 

题解:

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

 

E - A Hard Allocation

 HDU - 6484 

彭彭写题解!

 

G - Flower

 HDU - 6486 

金姐和彭彭写题解!

 

H - Overflow

 HDU - 6487 

 

金姐写题解!

 

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

 

posted @ 2019-05-08 20:18 Tangent_1231 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值