群赛14----2017.9.24

T1 Jzzhu and Children

题意:

给你三个数,要求取出三个数,以1:2:4为比例,输出和.

解法:

暴力.

代码:

#include <bits/stdc++.h>
using namespace std;
#define N 1000000
#define LL long long
int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    int ans=0;
    while(ans*1<=a&&ans*2<=b&&ans*4<=c)
      ans++;
    cout<<(ans-1)*7;
    return 0;
}

网址:这一题

小结:

**此类题目水题。**

T2 Decoding

题意:

给你一个字符串,它是由原字符串通过不断取中位符所取出来的,输出原字符串.

解法:

暴力.

代码:

#include <bits/stdc++.h>
using namespace std;
#define N 1000000
#define LL long long
int tou, wei;
char x[100000], ans[10000];
int main()
{
    int a;
    cin >> a;
    for (int i = 1; i <= a; i++)
        cin >> x[i];
    if (a % 2 != 0)
    {
        // cout << 6;
        tou = a / 2, wei = tou + 1;
        for (int i = 1; i <= a; i++)
        {
            if (i % 2 == 1)
            {
                ans[wei] = x[i];
                wei++;
            }
            if (i % 2 == 0)
            {
                ans[tou] = x[i];
                tou--;
            }
        }
    }
    else
    {
        // cout << a;
        tou = a / 2, wei = tou + 1;
        for (int i = 1; i <= a; i++)
        {

            if (i % 2 != 0)
            {
                ans[tou] = x[i];
                tou--;
            }
            else
            {
                ans[wei] = x[i];
                wei++;
            }
        }
        // cout << tou << " " << wei;
    }

    for (int i = 1; i <= a; i++)
        cout << ans[i];
    return 0;
}

网址:这一题

小结:

**此类题目暴力。**

T3 Tram

题意:

太麻烦了自己看,就是一个简单的模拟.

解法:

暴力。

代码:

#include <bits/stdc++.h>
using namespace std;
int s, r, mu, vc, vr, p, d;
int main()
{
    cin >> s >> r >> mu;
    cin >> vc >> vr;
    cin >> p >> d;
    if (r > mu)
    {
        r = s - r;
        mu = s - mu;
        d *= -1;
        p = s - p;
    }
    p *= d;
    if (p > r)
        p -= 2 * s;
    int ans = min((mu - r) * vr, (mu - p) * vc);
    printf("%d\n", ans);
}

网址:这一题

小结:

**此类题目暴力。**

T4 Green and Black Tea

题意:

你有几个茶包,有两种,每种不能连续喝超过k包,给你绿包喝红包的数量,用"G"和"B",表示喝的顺序,

解法:

暴力模拟.

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define N 400010
char x[N]; //100000 50000 50000 50000
int main()
{
    char dan, xiaon;
    int n, k, a, b, da = 0, xiao;
    cin >> n >> k >> a >> b;
    xiao = min(a, b);
    if (xiao == a)
    {
        xiaon = 71;
        dan = 66;
    }
    else
    {
        xiaon = 66;
        dan = 71;
    }
    da = max(a, b);
    // cout<<da/(xiao+1)
    if (da * 1.0 / (xiao + 1) > k)
    {
        cout << "NO";
        return 0;
    }
    else
    {
        da -= xiao;
        for (int i = 1; i <= xiao; i++)
        {
            if (da > k - 1)
            {
                for (int i = 1; i <= k - 1; i++)
                {
                    cout << dan;
                    n--;
                    if (n == 0)
                        return 0;
                }
                da -= k - 1;
            }
            cout << dan;
            n--;
            if (n == 0)
                return 0;
            cout << xiaon;
            n--;
            if (n == 0)
                return 0;
        }
    }
    for (int i = 1; i <= da; i++)
    {
        cout << dan;
        n--;
        if (n == 0)
            return 0;
    }
    return 0;
}

网址:这一题

小结:

**此类题目较易,就是不好调试。**

T5 Numbers Exchange

题意:

给你几个数,和另几个数,经过几次转换,让奇数和偶数的个数相同,问最少可以有几次交换.

解法:

根据题意写就行了,找规律。

代码:

#include <bits/stdc++.h>
#include <map>
using namespace std;
int n, m, que[200010], top, s[2], w, hhh[200010], qqq[200010];
map<int, int> mmm;
struct point
{
    int v, id;
    bool operator<(const point b) const { return v < b.v; }
} p[200010];
int main()
{
    scanf("%d%d", &n, &m);

    for (int i = 1; i <= n; i++)
        scanf("%d", &p[i].v), p[i].id = i, qqq[i] = p[i].v;

    sort(p, p + 1 + n);
    hhh[p[1].id] = 1;
    s[p[1].v & 1]++;
    mmm[p[1].v] = 1;

    for (int i = 2; i <= n; i++)
        if (p[i].v != p[i - 1].v && s[p[i].v & 1] < (n >> 1))
            hhh[p[i].id] = 1, s[p[i].v & 1]++, mmm[p[i].v] = 1;

    s[0] = (n >> 1) - s[0];
    s[1] = (n >> 1) - s[1];

    int cnt = s[0] + s[1];

    for (int i = 1; i <= m && (s[0] || s[1]); i++)
        if (!mmm[i] && s[i & 1])
            que[top++] = i, s[i & 1]--;

    if (s[0] || s[1])
        printf("-1\n");
    else
    {
        printf("%d\n", cnt);
        for (int i = 1; i <= n; i++)
        {
            if (hhh[i])
                printf("%d ", qqq[i]);
            else
                printf("%d ", que[--top]);
        }
    }
    return 0;
}

网址:这一题

小结:

**此类题目较难。**

T5 Music in Car

题意:

你在车上,可以听歌,每首歌有一个价值,你可以在只听n首的一半.

解法:

暴力.

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200005;
int a[MAXN], t[MAXN];
multiset<int> hh, gg;
int main()
{
    int n, w, k;
    scanf("%d%d%d", &n, &w, &k);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        a[i] += a[i - 1];
    }
    for (int i = 1; i <= n; i++)
        scanf("%d", &t[i]);
    int ans = 0;
    for (int l = 1, r = 0; l <= n; l++)
    {
        while (k >= 0 && r <= n)
            if ((++r) <= n)
            {
                k -= (t[r] + 1) / 2;
                gg.insert(t[r]);
                while ((int)gg.size() > w)
                {
                    k += (*gg.begin() + 1) / 2;
                    k -= *gg.begin();
                    hh.insert(*gg.begin());
                    gg.erase(gg.begin());
                }
            }
        ans = max(ans, a[r - 1] - a[l - 1]);
        if (hh.find(t[l]) != hh.end())
        {
            hh.erase(hh.find(t[l]));
            k += t[l];
        }
        else
        {
            gg.erase(gg.find(t[l]));
            k += (t[l] + 1) / 2;
            while ((int)gg.size() < w && !hh.empty())
            {
                k += *(--hh.end());
                k -= (*(--hh.end()) + 1) / 2;
                gg.insert(*(--hh.end()));
                hh.erase(--hh.end());
            }
        }
    }
    printf("%d", ans);
    return 0;
}

网址:这一题

小结:

**此类题目较难。**

T5 New Roads

题意:

在给你的几条路中,按要求去几条.

解法:

数列.

代码:

#include <bits/stdc++.h>
using namespace std;
vector<int> v[200010];
int fa[200010], gg[200010];
int n, t, k, hh = 0, l;
int main()
{
    cin >> n >> t >> k;
    l = n - k - t;
    for (int i = 1; i <= t; i++)
        scanf("%d", gg + i);
    gg[0] = 1;
    if ((gg[t] > k) || (n - t < k) || (n < k))
    {
        cout << -1;
        return 0;
    }
    for (int i = 0; i <= t; i++)
    {
        for (int j = 1; j <= gg[i]; j++)
            v[i].push_back(++hh);
    }
    for (int i = 0; i <= gg[1] - 1; i++)
        fa[v[1][i]] = 1;
    for (int i = 2; i <= t; i++)
        fa[v[i][0]] = v[i - 1][0];
    for (int i = 2; i <= t; i++)
    {
        for (int j = 1; j < gg[i]; j++)
        {
            if (l != 0 && j <= gg[i - 1] - 1)
            {
                fa[v[i][j]] = v[i - 1][j];
                l--;
            }
            else
                fa[v[i][j]] = v[i - 1][0];
        }
    }
    if (l != 0)
    {
        cout << -1;
        return 0;
    }
    cout << n;
    for (int i = 2; i <= n; i++)
        cout << "\n"
             << fa[i] << " " << i;
    return 0;
}

网址:这一题

小结:

**此类题目较难。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值