2022 RoboCom 世界机器人开发者大赛-本科组(省赛)

一.RC-u1 不要浪费金币


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


typedef long long ll;
typedef pair<int,int> pii;
const int N=1010;
int a[N]; 


int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	int n,m;
	cin>>n>>m;
	int ans=0;
	for(int i=1;i<=n;i++){//离线 
		cin>>a[i];
	} 
	int sum=0;
	for(int i=0;i<n;i++){
		if(sum+a[i+1]>m){
			sum=0;
			ans++;
			//cout<<i<<endl;
		}
		 sum+=a[i+1];
		//cout<<i<<sum<<endl;
	}
	cout<<ans<<endl;
	return 0;
}

二.RC-u2 智能服药助手

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


typedef long long ll;
typedef pair<int,int> pii;
const int N=1010;
int a[N];//记录药的需要间隔 
vector<int> times[N];//每个药的服药时间 


int main(){
	ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
	while(m--){
		int t,k,temp;
		cin>>t>>k;
		for(int i=1;i<=k;i++){
			cin>>temp;
			if(times[temp].size()!=0&&t-times[temp].back()<a[temp])cout<<"Don't take "<<temp<<" at "<<t<<"!"<<endl;
			else times[temp].push_back(t);
		}	
	}
	 
	return 0;
}

三.RC-u3 跑团机器人

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int tou[1100];

bool isdigite(char x){
	if(x>='0'&&x<='9')return true;
	return false;
}


int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	
	string s;
	cin>>s;
	ll sum1=0,sum2=0;
	int flag=1;//表示加法 
	int bigtou=0;
	int smalltou=1100;
	for(int i=0;i<s.size();i++){
		int mx=0,mn=0;//一开始如果是个-,需要白白经过一次,如果不初始化mx,就会加入一个乱码
		
		int t=0;//暂存数字 
		//求前数字或者单个数字 
		if(isdigite(s[i])){
		while(isdigite(s[i])){
			t=10*t+(s[i]-'0');
			i++;
		 }
		 if(flag==1)mx=mn=t;
		 else mx=mn=-t;
     	}
     	
		if(s[i]=='d'){
			int t2=0;
			if(t==0)t=1;//特殊判断
			i++;
			while(isdigite(s[i])){
			  t2=10*t2+(s[i]-'0');
			  i++;
		    }
		    tou[t2]+=t;
		    bigtou=max(bigtou,t2);
		    smalltou=min(smalltou,t2);
		    //cout<<t2<<' '<<t<<endl;
		    if(flag==1){
		      mn=t;
			  mx=t*t2;	
			}
			if(flag==0){
			  mn=-t*t2;
			  mx=-t;
			//  puts("me");	
			}
		}
		//cout<<"hei"<<mx<<' '<<mn<<" "<<flag<<endl;
		sum1+=mn;
		sum2+=mx;
		
		if(s[i]=='+')flag=1;
		if(s[i]=='-')flag=0;
	//	cout<<flag<<endl;
		
	}
	
    for(int i=smalltou;i<=bigtou;i++)
      if(tou[i]!=0)cout<<i<<' '<<tou[i]<<endl;
	
	cout<<sum1<<' '<<sum2<<endl;
	
	return 0;
}

四.RC-u4 攻略分队

五.RC-u5 树与二分图

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
/*思路:首先需要知道,二分图的充分必要条件是有奇数环(树一定是二分图) 
对于一个树来说,本身是一个二分图,最大的情况是每个部分都和另一部分的点有线,此时再加任何一条线都会有奇数环。
也可以说,对于一个树是二分图,本身已经分成uv两部分,这部分线必须在uv之间,而不能再uv内(正难则反) 
 


对于顶点数为n的二分图, 假设划分的两个集合顶点数分别为m , n-m. 
显然这个二分图的最大边数为m*(n-m), 即每个顶点与对面集合所有顶点都形成的边.
由此, 我们只需要得出任一集合数量, 就可以算出最大边数, 减去已有边数即为答案 
*/ 
const int N=1e6+10;
int h[N],e[2*N],ne[2*N];//注意:邻接表注意点1:无向边2倍 
int idx; 
int m;
int n;

int color[N];

void add(int a,int b){
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

void dfs(int u,int c){
	color[u]=c;//染色
	if(color[u]==1)m++;
	for(int i=h[u];i!=-1;i=ne[i]) {
		int j=e[i];
		if(!color[j])dfs(j,3-c);//1 2染色 
	}
	return;
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	
	
	memset(h,-1,sizeof(h));//注意:邻接表注意点2,需要初始化
	cin>>n;
	int temp=n;
	while(temp--){//注意:如果n--就成0了
		int a,b;
		cin>>a>>b;
		add(a,b),add(b,a);
	}
	
	/*注意: 
	由于已知是二分图,只需要求每部分点数,只需要染色,不需要判断 
	
	染色(由于数目是联通的,所以不存在一个点染不完的情况),用一个点可以 
	为了普适性,我们写基本的(两个点单独连) 
	*/ 

	for(int i=1;i<=n;i++){
		if(!color[i])dfs(i,1);
	} 
	
	cout<<(ll)m*(n-m)-(n-1)<<endl;//注意:特别是乘法,如果不转化成ll容易爆int 
	
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值