2023年中国传媒大学程序设计大赛(同步赛)A — E

2023年中国传媒大学程序设计大赛(同步赛)

A. ACM

题目分析

根据输入打出相对应个数的0即可

code
#include

using namespace std;

int n;
int main()
{
    cin >> n;
    if(n == 0) cout << 0 ;
    else
    {
        cout << "0.";
        for(int i = 1; i <= n; i ++) cout << 0;
    }
    return 0;
}

B.贪吃的Diana

题目分析

计算每天吃的食物饱腹感的值,判断是否满足要求并计数即可

code
#include
#define int long long

using namespace std;

const int N = 1e5 + 10;

int n, k, s;
int a[N];

signed main()
{
    cin >> n >> k >> s;

    for(int i = 1; i <= s; i ++)
    {
        int u, v;
        cin >> u >> v;
        a[u] += v;
    }

    int ans = 0;
    for(int i = 1; i <= n; i ++)
        if(a[i] < k) ans ++;

    cout << ans << "\n";
}

C.神河霓朝纪

题目分析

统计可以获得的各类能量值,判断是否可以满足所有咒语的要求,要额外注意无色费用的情况

code
#include 
#define int long long

using namespace std;

int a[10], b[10];
int n, m, k, t;

void init()
{
    for(int i = 0; i < 10; i ++) a[i] = 0, b[i] = 0;
}

void solve()
{
    init();
    cin >> n;

    for(int i = 1; i <= n; i ++)
    {
        char c;
        cin >> c;
        if(c == 'W') a[1] ++;
        if(c == 'U') a[2] ++;
        if(c == 'B') a[3] ++;
        if(c == 'G') a[4] ++;
        if(c == 'R') a[5]++;
    }

    cin >> m;
   for(int i = 1; i <= m; i ++)
    {
        string s;
        cin >> s;
        for(int i = 0;i < s.size();i++)
        {
            if(s[i] == 'W') b[1] ++;
            if(s[i] == 'U') b[2] ++;
            if(s[i] == 'B')b[3] ++;
            if(s[i] == 'G') b[4] ++;
            if(s[i] == 'R') b[5] ++;
            if(s[i] == 'O')b[6] ++;
        }
    }

    int f = 1;
    for(int i = 1;i <= 5;i++)
    {
        if(a[i] >= b[i])
        {
            a[i] = a[i]-b[i];
        }
        else if(a[i] < b[i])
        {
            f = 0;
            puts("NO");
            break;
        }
    }
    if(f)
    {
        int sum = 0;
        for(int i = 1;i <= 5;i++) sum += a[i];
        if(sum >= b[6]) puts("YES");
        else puts("NO");
    }
}

signed main()
{
    cin >> t;
    while(t--) solve();
    return 0;
}

D.穿袜子

题目分析

至少拿出多少只可以保证配对也就是最多可以拿出多少只不配对,可以通过拿不同图案,每种图案的贡献值取左右脚之中的较大者,对于*类,最多选一只。统计过程中顺便判断是否能配对。

code
#include
#define int long long
#define x first
#define y second

using namespace std;

const int N = 1e5 + 10;

int n, m, k, t;
map<int, int>q;

signed main()
{
    cin >> n;

    bool f = false;
    for(int i = 0; i < n; i ++)
    {
        int u, v;
        char c;
        cin >> u >> c >> v;
        if(c == '*')
        {
            if(v >= 2) f = true;
            if(q.count(u)) f = true;
            q[u] = max(q[u], (int)1);
        }
        else
        {
             if(q.count(u)) f = true;
             q[u] = max(q[u], v);
        }
    }

    if(f)
    {
        int ans = 0;
        for(auto &[l, r] : q) ans += r;
        cout << ans + 1 << "\n";
    }
    else puts("-1");
}

E.反转拼图

题目分析

可以将3*3矩阵抽象成为9位的二进制数,01表示状态,而翻转操作就相当于将对应位置上的数与1进行一次异或操作。

可以枚举出对于9个二进制位进行操作的所有状态,找到某在一种状态下操作的最小值。

code
#include
#define int long long

using namespace std;

const int N = 5;
typedef pair<int, int> PII;

int n, m, k, t;
int c[N][N], a[N][N];
vector<PII>ans;
int dx[6] = {0, 1, 0, -1, 0}, dy[6] = {1, 0, -1, 0, 0};

int get(int a, int b)
{
    return a * 3 + b;
}

signed main()
{
    int state = 0;
    for(int i = 0; i < 3; i ++)
    {
        for(int j = 0; j < 3; j ++)
        {
            cin >> a[i][j];
            if(a[i][j] ==  1)
                state += (1 << get(i, j));
        }
    }

    for(int i = 0; i <3; i ++)
    {
        for(int j = 0; j < 3; j ++)
        {
            for(int k = 0; k < 5; k ++)
            {
                int xx = i + dx[k], yy = j + dy[k];
                if(xx >= 0 && xx < 3 && yy >= 0 && yy < 3)
                {
                    c[i][j] += (1 << get(xx, yy));
                    //cout << xx << "--" << yy << "\n";
                }
            }

            //cout << c[i][j] << "\n";
        }
    }

    int ans = 0, tem = 0;
    for(int i = 0; i < (1 << 9); i++)
    {
        int now = state;
        tem = 0;

        for(int j = 0; j < 9; j ++)
        {
            if(i >> j & 1)
            {
                int x = j / 3, y = j % 3;
                now ^= c[x][y];
                tem ++;
            }
        }

        if(!now && (ans == 0 || ans > tem)) ans = tem;
    }

    cout << ans << "\n";

    return 0;
}

你可能感兴趣的:(牛客,洛谷及其他,算法,c++,数据结构,贪心算法)