2022睿抗补题

RC-u1 不要浪费金币 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)

RC-u2 智能服药助手 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)

RC-u3 跑团机器人 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)

RC-u4 攻略分队 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)

RC-u5 树与二分图 - 2022 RoboCom 世界机器人开发者大赛-本科组(省赛) (pintia.cn)

第一题:模拟

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e3 + 10;
int n, m;
int p[N];
void solve()
{
    cin >> n >> m;
    int cnt = 0, sum  = 0;
    for(int i = 1; i <= n; i ++)  cin >> p[i];

    for(int i = 1; i <= n; i ++){
        if(sum + p[i] > m){
            sum = p[i];
            cnt ++;
        }
        else sum += p[i];
    }
    cout << cnt;
}
signed main()
{
    int _ = 1; //cin >> _;
    while(_ --){
        solve();
    }
}

第二题:记录前面一个同种药物的吃药时间,与当前吃药时间比较看是否超出服药间隔

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e3 + 10;
int n, m;
int pre[N];
int gap[N];

void solve()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i ++) cin >> gap[i], pre[i] = -1;

    while(m --){
        int t, k;   cin >> t >> k;
        while(k --){
            int medi;  cin >> medi;
            if(gap[medi] == -1) continue;
            if(pre[medi] == -1) pre[medi] = t;
            else {
                if(t - pre[medi] < gap[medi]){
                    printf("Don't take %d at %d!\n", medi, t);
                    continue;
                }
                else pre[medi] = t;
            }
        }
    }
}

signed main()
{
    int _ = 1; //cin >> _;
    while(_ --){
        solve();
    }
}

第三题:字符串处理出来作比较 有d的就是骰子(如果是加最大值和最小值同时加减,如果是减,最大值减去最少的丢失情况 最小值减去最大的丢失情况) 没有的就直接加减(最大值和最小值同时加减)

#include<bits/stdc++.h>
#define int long long
using namespace std;
map<int, int> mp;

void solve()
{
    string str;  cin >> str;
    str = "+" + str + "+";
    int l = 0, r = 0;
  // cout << str << endl;
    int n = str.size();
    for(int i = 0; str[i] ; i ++){
       if(str[i] == '+' && i + 1 < n){
        int x = 0, y = 0, z = 0;
            int j = i + 1;
            bool f = 0;
            while((str[j] != '+' && str[j] != '-') && j < n){
                if(str[j] == 'd') {
                    f = 1;
                    j ++;
                    continue;
                }
                if(f == 0)  x = x * 10 + str[j] - '0';
                else y = y * 10 + str[j] - '0';
                j ++;
            }
        
            if(f == 0) l += x, r += x;
            else 
            {
                
                if(y == 0) y = 1;
                if(x == 0) x = 1;
                mp[y] += x;
             
                l += 1 * x, r += y * x;
            }
          
            i = j - 1;
       }
       else if(str[i]  == '-' && i + 1 < n){
        int x = 0, y = 0, z = 0;
            int j = i + 1;
            bool f = 0;
            while(str[j] != '+' && str[j] != '-' && j< n){
                if(str[j] == 'd') {
                    j ++;
                    f = 1;
                    continue;
                }
                if(f == 0)  x = x * 10 + str[j] - '0';
                else y = y * 10 + str[j] - '0';
                j ++;
            }
          
            if(f == 0) l -= x, r -= x;
            else 
            {
                if(y == 0) y = 1;
                if(x == 0) x = 1;
                mp[y] += x;
                l -= y * x, r -= 1 * x;
            }
            i = j - 1;
       }
    }
    for(int i = 1; i <= 1000; i ++)
    {
        if(mp[i])  cout << i << " " << mp[i] << endl;
    }
    cout << l << " " << r << endl;
}

signed main()
{
    int _ = 1; //cin >> _;
    while(_ --){
        solve();
    }
}

第四题:dfs枚举所有可能的情况,最后做判断看是否可以用(代码是从佬那里的)

#include<bits/stdc++.h>

using namespace std;
const int N = 10;
int num[N];
bool A[N], B[N], C[N];
int totalA;//坦克总数
vector<int> ans1, ans2;
bool R0, R1, R2;
vector<int> tmp1, tmp2;//当前要判断的方案

void judge()
{
    if(tmp1.empty() || tmp2.empty()) return;//空的不要
    bool r0, r1, r2, t1, t2;
    t1 = t2 = false;
    for(int i : tmp1)
    {
        if(A[i]) {
            t1 = true;
            break;
            }
    }
    for(int i : tmp2)
    {
        if(A[i]) {
            t2 = true;
            break;
            }
    }
    r0 = t1 & t2;//两组是不是都有坦克
    if(!r0) return;//不是 不要

    t1 = t2 = false;
    for(int i : tmp1){
        if(C[i]){
            t1 = true;
            break;
        }
    }
    for(int i : tmp2){
        if(C[i]){
            t2 = true;
            break;
        }
    }
    r2 = t1 & t2;//两组都有指挥

    t1 = t2 = false;
     for(int i : tmp1){
        if(B[i]){
            t1 = true;
            break;
        }
    }
    for(int i : tmp2){
        if(B[i]){
            t2 = true;
            break;
        }
    }
    r1 = r2 && t1 && t2;//两组都有指挥 工兵
    if(!R0){                               //没填过答案给一个答案
        ans1 = tmp1;  ans2 = tmp2;
        R0 = r0, R1 = r1, R2 = r2;
        return;
    }

    if(R1 && !r1) return;//ans里面有满足有指挥和工兵的 当前这个tmp里面不满足都有指挥和工兵的条件  不要
    if(r1 && !R1){         //ans里面没有指挥和工兵都满足   但是tmp里面满足了    换
        ans1 = tmp1;  ans2 = tmp2;
        R0 = r0, R1 = r1, R2 = r2;
        return;
    }
    if(!R1 && !r1){  //   ans里面没有满足都有指挥和工兵都满足   tmp里面也没有
        if(R2 && !r2) return;//    但是ans有指挥     tmp没有指挥   不换
        if(!R2 && r2){     // ans没有指挥   tmp有指挥   换
            ans1 = tmp1;  ans2 = tmp2;
            R0 = r0, R1 = r1, R2 = r2;
        return;
        }
    }

    //规则3
    int an1 = 0, an2 = 0, tn1 = 0, tn2 = 0;
    for(int i : ans1) an1 += num[i];
    for(int i : ans2) an2 += num[i];
    for(int i : tmp1) tn1 += num[i];
    for(int i : tmp2) tn2 += num[i];

    int d1 = abs(an1 - an2), d2 = abs(tn1 - tn2);
    if(d1 < d2) return;//ans的人数更平均   不换
    if(d1 > d2){   //  tmp人数更平均    换
        ans1 = tmp1;  ans2 = tmp2;
        R0 = r0, R1 = r1, R2 = r2;
        return;
    }

    t1 = (an1 > an2), t2 = (tn1 > tn2);//欧文大于亚特
    if(t1 && !t2) return;//   tmp的欧文不大于亚特  不换
    if(t2 && !t1){    // 欧文的大于亚特   换
        ans1 = tmp1;  ans2 = tmp2;
        R0 = r0, R1 = r1, R2 = r2;
        return;
    }

    for(int k = 0; k < ans1.size() && k < ans2.size(); k ++){
        if(ans1[k] < tmp1[k]) return;
        else if(ans1[k] > tmp1[k]){//讨伐欧文的编号最小的
            ans1 = tmp1;  ans2 = tmp2;
            R0 = r0, R1 = r1, R2 = r2;
            return;
        }
    }
}

void dfs(int i)
{
    if(i > 6) 
    {
        judge();
        return;
    }

    if(num[i] == 0){
        dfs(i + 1);//不选  没有组要
        return;
    }
    tmp1.push_back(i);//第一组要
    dfs(i + 1);
    tmp1.pop_back();

    tmp2.push_back(i);
    dfs(i + 1);//第二组要
    tmp2.pop_back();
}

signed main()
{
   for(int i = 1; i <= 6; i ++)  cin >> num[i];
    string ABC;
    for(int i = 1; i <= 6; i ++){
        cin >> ABC;
        if(ABC[0] == '1') A[i] = true, totalA ++;
        if(ABC[1] == '1') B[i] = true;
        if(ABC[2] == '1') C[i] = true;
    }
    if(totalA < 2){
        cout << "GG";
        return 0;
    }
    else{
        dfs(1);
        for(int i = 0; i < ans1.size(); i ++){
            if(i != 0) cout << " ";
            cout << ans1[i];
        }
        cout << endl;
        for(int i = 0; i < ans2.size(); i ++){
            if(i != 0) cout << " ";
            cout << ans2[i];
        }
        cout << endl;
    }
    return 0;
}

第五题:将奇数深度看作红色 偶数深度看作蓝色 答案是当前深度的颜色(比方说红色)*(前面所有不同颜颜色(蓝色)- 1)的和

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6;
int  deep[N];//奇数是红色 偶数是蓝色
vector<int> g[N];
int red = 0, blue = 0;
int n;
bool st[N];

void dfs(int u, int i)
{
	deep[i] ++;
	st[u] = 1;
	//cout << u << "深度是"  << i << endl;
	//cout << g[u].size() << endl;
	for(int j = 0; j < g[u].size(); j ++)
	{
		if(st[g[u][j]])   continue;
		dfs(g[u][j], i + 1);
	}
}

signed main()
{
	cin >> n;
	for(int i = 1; i < n; i ++){
		int a, b;  cin >> a >> b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
//	for(int i = 1; i <= n; i ++)
//	{
//		cout  << i << "是父亲" << '\n';
//		
//		for(int j = 0; j < g[i].size(); j ++)
//			cout << g[i][j] << " ";
//		cout << endl;
//	}
	dfs(1, 1);
	//for(int i = 1; i <= n; i ++)  cout << deep[i] << endl;
	int res = 0;
	for(int i = 1; i <= n; i ++)
	{
		if(deep[i] == 0) break;//下面没有根了  滚吧
		if(i == 1)
		{
			red += deep[i];
			continue;
		}
		int t = deep[i];
		// cout << i << " " << red << " " << blue << endl;
		if(i % 2)//红色连上面没有关系的蓝色
		{
			if(blue!=0)
				res += t * (blue - 1);
			red += t;
		}
		else//蓝色连上面没有关系的红色
		{
			if(red!=0)
				res += t * (red - 1);
			blue += t;
		}
	}
	cout << res;
	return 0;
}

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值