群赛15----2017.9.25

T1 Fashion in Berland

题意:

给你一串数字由0和1组成,要求整个串里必须只有一个0(只有一个数除外).

解法:

暴力.

代码:

#include <bits/stdc++.h>
using namespace std;
int x[10000];
int main()
{
    int a, bu = 0;
    cin >> a;
    for (int i = 1; i <= a; i++)
    {
        cin >> x[i];
        if (x[i] == 0)
            bu++;
    }
    if ((bu == 1 && a > 1) || (a == 1 && bu == 0))
        cout << "YES";
    else
        cout << "NO";
    return 0;
}

网址:这一题

小结:

**此类题目水题。**

T2 s-palindrome

题意:

给你一个字符串,请问其整个对折可不可以重合?

解法:

暴力.

代码:

#include <bits/stdc++.h>
using namespace std;
char x[10000];
int main()
{
    int lan = 0;
    char zz;
    while (scanf("%c", &zz) == 1 && zz != 10)
    {
        lan++;
        x[lan] = zz;
    }
    for (int i = 1; i <= lan / 2; i++)
    {
        if (x[i] == 'A' && x[lan - i + 1] == 'A')
            continue;
        else if (x[i] == 'b' && x[lan - i + 1] == 'd')
            continue;
        else if (x[i] == 'd' && x[lan - i + 1] == 'b')
            continue;
        else if (x[i] == 'H' && x[lan - i + 1] == 'H')
            continue;
        else if (x[i] == 'I' && x[lan - i + 1] == 'I')
            continue;
        else if (x[i] == 'U' && x[lan - i + 1] == 'U')
            continue;
        else if (x[i] == 'M' && x[lan - i + 1] == 'M')
            continue;
        else if (x[i] == 'o' && x[lan - i + 1] == 'o')
            continue;
        else if (x[i] == 'O' && x[lan - i + 1] == 'O')
            continue;
        else if (x[i] == 'p' && x[lan - i + 1] == 'q')
            continue;
        else if (x[i] == 'q' && x[lan - i + 1] == 'p')
            continue;
        else if (x[i] == 'X' && x[lan - i + 1] == 'X')
            continue;
        else if (x[i] == 'x' && x[lan - i + 1] == 'x')
            continue;
        else if (x[i] == 'Y' && x[lan - i + 1] == 'Y')
            continue;
        else if (x[i] == 'T' && x[lan - i + 1] == 'T')
            continue;
        else if (x[i] == 'V' && x[lan - i + 1] == 'V')
            continue;
        else if (x[i] == 'v' && x[lan - i + 1] == 'v')
            continue;
        else if (x[i] == 'W' && x[lan - i + 1] == 'W')
            continue;
        else if (x[i] == 'w' && x[lan - i + 1] == 'w')
            continue;
        // else if (x[i] == 'm' && x[lan - i + 1] == 'm')
        //  continue;
        // else if (x[i] == 'n' && x[lan - i + 1] == 'n')
        //  continue;
        else
        {
            cout << "NIE";
            return 0;
        }
    } //|| x[lan / 2 + 1] == 'n' x[lan / 2 + 1] == 'm'  ||
    if (lan % 2 == 1 && x[lan / 2 + 1] == 'A' || x[lan / 2 + 1] == 'H' || x[lan / 2 + 1] == 'I' || x[lan / 2 + 1] == 'M' || x[lan / 2 + 1] == 'O' || x[lan / 2 + 1] == 'o' || x[lan / 2 + 1] == 'T' || x[lan / 2 + 1] == 'U' || x[lan / 2 + 1] == 'V' || x[lan / 2 + 1] == 'v' || x[lan / 2 + 1] == 'W' || x[lan / 2 + 1] == 'w' || x[lan / 2 + 1] == 'x' || x[lan / 2 + 1] == 'X' || x[lan / 2 + 1] == 'Y')
        cout << "TAK";
    else if (lan % 2 == 0)
        cout << "TAK";
    else
        cout << "NIE";
    return 0;
}

网址:这一题

小结:

**此类题目暴力。**

T3 Exponential notation

题意:

给你一个数,把他转换成科学计数法.

解法:

暴力。

代码:

#include <bits/stdc++.h>
using namespace std;
char x[1000000];
int main()
{
    char zz;
    int lan = 0, flag = -1000, flag2;
    while (scanf("%c", &zz) == 1 && zz != 10)
    {
        lan++;
        x[lan] = zz;
        if (x[lan] == '.')
            flag = lan;
    }
    int tou = 1, wei = lan;
    while (x[tou] == '0' || x[tou] == '.')
        tou++;
    while (x[wei] == '0' || x[wei] == '.')
        wei--;
    if (flag == -1000)
    {
        cout << x[tou];
        if (wei - tou > 0)
            cout << ".";
        for (int i = tou + 1; i <= wei; i++)
            cout << x[i];
        if (lan - tou > 0)
            cout << "E" << lan - tou;
    }
    else
    {
        flag2 = flag - tou;
        // cout << flag2;
        cout << x[tou];
        if (wei != tou)
            cout << ".";
        for (int i = tou + 1; i <= wei; i++)
            if (x[i] != '.')
                cout << x[i];
        if (flag2 != 1 && flag2 > 0)
            cout << "E" << flag2 - 1;
        else if (flag2 != 1)
            cout << "E" << flag2;
    }
    return 0;
}

网址:这一题

小结:

**此类题目暴力。**

T4 Swaps in Permutation

题意:

给你一串数字,在给你一些规则,规则是可以将某些位上的数字交换,请输出最大数字串.

解法:

大头堆.

代码:

#include <bits/stdc++.h>
using namespace std;
#define N 1000020
int fa[N], nn, mm;
priority_queue<int> p[N];
int find(int a)
{
    if (fa[a] == a)
        return fa[a];
    else
    {
        fa[a] = find(fa[a]);
        return fa[a];
    }
}
int main()
{
    int a, b, flag;
    cin >> a >> b;
    for (int i = 1; i <= a; i++)
    {
        scanf("%d", &flag);
        fa[i] = i;
        p[i].push(flag);
    }
    for (int i = 1; i <= b; i++)
    {
        scanf("%d%d", &mm, &nn);
        if (find(mm) == find(nn))
            continue;
        else if (p[find(mm)].size() > p[find(nn)].size())
        {
            while (!p[fa[nn]].empty())
            {
                p[fa[mm]].push(p[fa[nn]].top());
                p[fa[nn]].pop();
            }
            fa[fa[nn]] = fa[mm];
        }
        else
        {
            while (!p[fa[mm]].empty())
            {
                p[fa[nn]].push(p[fa[mm]].top());
                p[fa[mm]].pop();
            }
            fa[fa[mm]] = fa[nn];
        }
    }
    for (int i = 1; i <= a; i++)
    {
        cout << p[find(i)].top() << " ";
        p[find(i)].pop();
    }
    return 0;
}

网址:这一题

小结:

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

T5 Xor-sequences

题意:

给定序列,从序列中选择k(1≤k≤1e18)个数(可以重复选择),使得得到的排列满足xi与xi+1异或的二进制表示中1的个数是3的倍数。问长度为k的满足条件的 序列有多少种?

解法:

矩阵快速幂

代码:

#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;
}

网址:这一题

小结:

**此类题目较难。,好题**

T6 Couple Cover

题意:

给一个数列,问这里面有多少对的积大于等于p;

解法:

预处理.

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 3000001;
LL x[N], y[N];
int main(void)
{
    LL i, j, k, n, m;
    scanf("%I64d", &n);
    for (LL i = 1; i <= n; i++)
    {
        scanf("%I64d", &k);
        x[k]++;
    }
    for (LL i = 1; i < N; i++)
        for (LL j = 1; j * i < N; j++)
            y[i * j] += x[i] * (x[j] - (i == j));
    for (LL i = 1; i < N; i++)
        y[i] += y[i - 1];
    scanf("%I64d", &m);
    while (m--)
    {
        scanf("%I64d", &k);
        printf("%I64d\n", n * (n - 1) - y[k - 1]);
    }
    return 0;
}

网址:这一题

小结:

**此类题目较难。**
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值