羣賽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;
}

網址:這一題

小結:

**此類題目較難。**
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章