群赛15----2017.9.25

来源:互联网 发布:交互设计师软件 编辑:程序博客网 时间:2024/06/03 13:46

  • T1 Fashion in Berland
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T2 s-palindrome
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T3 Exponential notation
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T4 Swaps in Permutation
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T5 Xor-sequences
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结
  • T6 Couple Cover
    • 题意
    • 解法
    • 代码
    • 网址这一题
    • 小结

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 1000020int 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 longconst 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;}

网址:这一题

小结:

**此类题目较难。**
原创粉丝点击