2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)

T1

#include <bits/stdc++.h>
using namespace std;

const int N = 100;

int w[N];

int main()
{
	int n, cur;
	scanf("%d%d", &n, &cur);
	for(int i = 1; i <= n; i++)
		scanf("%d", &w[i]);
		
	int ans1 = 0, ans2 = 0;
	for(int i = 1; i <= n; i++, cur++)
	{
		if(cur > 7) cur = 1;
		
		if(w[i] >= 35 && cur != 4) ans1++;
		if(w[i] >= 35 && cur == 4) ans2++;
	}
	
	printf("%d %d", ans1, ans2);
}

T2

#include <bits/stdc++.h>
using namespace std;

const int N = 100;

int w[N] = {0, 12, 9, 7, 5, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1};
int ans[22];

int main()
{
	int t;
	scanf("%d", &t);
	while(t--)
	{
		for(int i = 1; i <= 20; i++)
		{
			int p, k;
			scanf("%d%d", &p, &k);
			ans[i] += w[p] + k;
		}
	}
	
	for(int i = 1; i <= 20; i++)
		printf("%d %d\n", i, ans[i]);
}

T3

#include <bits/stdc++.h>
using namespace std;

const int N = 1010;

int g[N][N], w[N][N];
int n, m;

void f(int a, int b, int x)
{
	bool nom = true;
	for(int i = a-1; i <= a+1; i++)
		for(int j = b-1; j <= b+1; j++)
		{
			if(i < 1 || j < 1 || i > n || j > m) continue;
			if(g[i][j] == 'm') nom = false;
			if(w[i][j] == 3 || w[i][j] == 2) continue;
			if(x == 1 && w[i][j] == 4) continue;
			w[i][j] = x;
		}
		
	if(nom && x == 1)
	{
		for(int i = a-1; i <= a+1; i++)
			for(int j = b-1; j <= b+1; j++)
			{
				if(i < 1 || j < 1 || i > n || j > m) continue;
				if(w[i][j] == 1) w[i][j] = 4;
			}
	}
}
int main()
{
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
		{
			scanf(" %c", &g[i][j]);
			if(g[i][j] != '.') w[i][j] = 3; //0空,1可能,2不可能,3被占, 4疑似
		}
		
		for(int i = 1; i <= n; i++)
			for(int j = 1; j <= m; j++)
			{
				if(g[i][j] == 'w') f(i, j, 1);
				else if(g[i][j] == 'c') f(i, j, 2);
			}
	
	bool has = false;
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			if(w[i][j] == 4)
				printf("%d %d\n", i, j), has = true;
				
	if(!has) puts("Too cold!");
}

T4

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
const int M = 2e5 + 10;

int h[N], e[M], ne[M], idx;
int p[N], cnt[N];
int st, ed;
int dist[N];

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int find(int x)
{
    if (p[x] != x)
        p[x] = find(p[x]);
    return p[x];
}
int bfs()
{
    memset(dist, 0, sizeof dist);
    dist[st] = 1;
    queue<int> q;
    q.push(st);

    while (q.size())
    {
        int u = q.front();
        q.pop();

        for (int i = h[u]; ~i; i = ne[i])
        {
            int j = e[i];
            if (u == st && j == ed)
                continue;
             if (dist[j])
                 continue;
            dist[j] = dist[u] + 1;
            if (j == ed)
                return dist[j];
            q.push(j);
        }
    }

    return -1;
}
int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        idx = 0;
        memset(h, -1, sizeof h);
        memset(cnt, 0, sizeof cnt);

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

        for (int i = 1; i <= m; i++)
        {
            int a, b;
            scanf("%d%d", &a, &b);
            add(a, b);
            add(b, a);
            int pa = find(a), pb = find(b);
            if (pa != pb)
            {
                cnt[pa] += cnt[pb]; // 归拢环数目到新的根节点
                p[pb] = pa;
            }
            else
            {
                cnt[pa]++;      // 检测到环
                st = a, ed = b; // 记录成环的端点
            }
        }

        int s = 0; // 子图个数(注意这个不是环的个数,而是只有一个环的连通块的个数)
        for (int i = 1; i <= n; i++)
            if (p[i] == i && cnt[i] == 1) // 并查集中一个根节点代表一个连通块
                s++;

        if (s != 1)
            printf("No %d\n", s);
        else
            printf("Yes %d\n", bfs());
    }
}

T5

#include <bits/stdc++.h>
using namespace std;

const int N = 5010;

int f[2][N];
struct node
{
    int t, d, p;
    bool operator<(const node &u) const
    {
        if (d != u.d)
            return d < u.d;
        //return t < u.t;
    }
} a[N];
int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        memset(f, 0, sizeof f);
        memset(a, 0, sizeof a);
        int tm = 0;

        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
            scanf("%d%d%d", &a[i].t, &a[i].d, &a[i].p), tm = max(tm, a[i].d);

        sort(a + 1, a + n + 1);
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= tm; j++)
            {
                f[i & 1][j] = max(f[i - 1 & 1][j], f[i & 1][j - 1]);
                if (j <= a[i].d && j >= a[i].t)
                    f[i & 1][j] = max(f[i & 1][j], f[i - 1 & 1][j - a[i].t] + a[i].p);
            }

        printf("%d\n", f[n & 1][tm]);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值