首页 > 其他分享 >RoboCom

RoboCom

时间:2023-10-16 18:14:30浏览次数:27  
标签:score int vector mq RoboCom gcd

RoboCom 本科组初赛

目录

7-1 懂的都懂

  • 思路:暴力把原图所有可能出现的和都算一遍存下来

  • 疑问:(参考部分和问题)如果用深搜,判断每一个拿或不拿复杂度应该是2^n?

  • 答:题目已经定了只用选4个数,部分和问题中用深搜是选择若干个数,所以时间复杂度高

    #include<bits/stdc++.h>
    using namespace std;
    int n,k;
    int yuan[100],sum[20000],xin[300];
    
    int main()
    {
    	cin>>n>>k;
    	
    	for(int i=0;i<n;i++)
    	cin>>yuan[i];
    	
    	for(int a=0;a<n;a++)
    	{
    		for(int b=a+1;b<n;b++)
    		{
    			for(int c=b+1;c<n;c++)
    			{
    				for(int d=c+1;d<n;d++)
    				{
    					sum[yuan[a]+yuan[b]+yuan[c]+yuan[d]]=1;
    				}
    			}
    		}
    	}
    	
    	while(k--)
    	{
    		bool f=1;
    		int kk;
    		cin>>kk;
    		for(int i=0;i<kk;i++)
    		cin>>xin[i];
    		for(int i=0;i<kk;i++)
    		{
    			if(!sum[xin[i]*4])
    			{
    				f=0;
    				break;
    			}
    		}
    		if(f)
    		cout<<"Yes"<<endl;
    		else
    		cout<<"No"<<endl;
    	}
    	
    	return 0;
     } 
    

7-2 芬兰木棋

  • 思路:(因为vector下标不能为负)利用mp将斜率离散化,然后用vector存下来,再根据离原点距离排序。由近到远,如果score为1,就能攒着一起打,如果大于1,单独打分更多。

  • 注意:第一三象限可能斜率一样,但是方向不一样(二四象限同理),所以再用个mp2把y为正和y为负的情况区分开。

  • 错解:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10;
    int n,cnt=10,ans,sum;
    map<double,int>mp1,mp2;
    struct muqi{
    	double x;
    	int score;
    }mq[N]; 
    
    bool cmp(muqi a,muqi b)
    {
    	return abs(a.x)<abs(b.x);
    }
    
    int main()
    {
    	cin>>n;
    	vector<muqi> v[70000];
    	for(int i=0;i<n;i++)
    	{
    		double y;
    		cin>>mq[i].x>>y>>mq[i].score;
    		double xl= y /mq[i].x;
    		if(y>0)
    		{
    			if(mp1[xl]<1)
    			mp1[xl]=cnt++;
    			v[mp1[xl]].push_back(mq[i]);
    		}
    		else
    		{
    			if(mp2[xl]<1)
    			mp2[xl]=cnt++;
    			v[mp2[xl]].push_back(mq[i]);
    		}
    	}
    	
    //	cout<<endl;
    	
    	for(int i=10;i<cnt;i++)
    	{
    		sort(v[i].begin(),v[i].end(),cmp); 
    		int js=0;
    		for(auto it:v[i])
    		{
    //			cout<<it.x<<" "<<" "<<it.score<<endl;
    			if(it.score==1)
    			{
    				js++;
    				continue;
    			}
    			else
    			{
    				sum+=js;
    				if(js)
    				ans++;
    				sum+=it.score;
    				js=0;
    				ans++;
    			}
    		}
    //		cout<<endl;
    	}
    	
    	cout<<sum<<" "<<ans<<endl;
    	return 0;
    }
    
  • 更正:vector里不用存所有数据,存mq[N]的下标就可以!!!然后对着下标再到mq数组里找出对应的分数!另外,在main外面定义vector好像能开得更大一点。

  • 更正2:不用计算斜率(可能会有误差),用map<pii,int>存,将横纵坐标gcd后make_pair存进去

  • 更正3:不能用x判断谁离原点近,如果有一条直线在y轴上(x全为0)就判断不了

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    typedef pair<int,int> pii;
    const int N=1e5+10;
    int n,cnt=10,ans,sum;
    map<pii,int>mp1,mp2;
    vector<int> v[N];
    struct muqi{
    	int x;
    	int score;
    }mq[N]; 
    
    bool cmp(int a,int b)
    {
    	return abs(mq[a].x)<abs(mq[b].x);
    }
    
    signed main()
    {
    	cin>>n;
    
    	for(int i=0;i<n;i++)
    	{
    		int y;
    		cin>>mq[i].x>>y>>mq[i].score;
    		sum+=mq[i].score;
    		int gcd=abs(__gcd(mq[i].x,y)); //gcd这里要加绝对值,不然可能为负 
    		mq[i].x /=gcd;
    		y/=gcd;
    		if(y>0)
    		{
    			if(mp1[make_pair(mq[i].x ,y)]<1)
    			mp1[make_pair(mq[i].x ,y)]=cnt++;
    			v[mp1[make_pair(mq[i].x ,y)]].push_back(i);
    		}
    		else
    		{
    			if(mp2[make_pair(mq[i].x ,y)]<1)
    			mp2[make_pair(mq[i].x ,y)]=cnt++;
    			v[mp2[make_pair(mq[i].x ,y)]].push_back(i);
    		}
    		mq[i].x=gcd; //不能用x判断谁离原点近,如果有一条直线在y轴上就判断不了了 
    	}
    	
    //	cout<<endl;
    	
    	for(int i=10;i<cnt;i++)
    	{
    		sort(v[i].begin(),v[i].end(),cmp); 
    		int js=0;
    		bool st=0;
    		for(auto it:v[i])
    		{
    			if(mq[it].score!=1)
    			{
    				st=0;
    				ans++;
    			}
    			else
    			{
    				if(!st)
    				{
    					st=1;
    					ans++;
    				}
    			}
    //如果最后一个是1,就没走else那部分,ans不变,出错 
    //			if(mq[it].score==1)
    //			{
    //				js++;
    //			}
    //			else
    //			{
    //				if(js)
    //				ans++;
    //				js=0;
    //				ans++;
    //			}
    		}
    	}
    	
    	cout<<sum<<" "<<ans<<endl;
    	return 0;
    }
    

标签:score,int,vector,mq,RoboCom,gcd
From: https://www.cnblogs.com/xiaoyangii/p/17768010.html

相关文章

  • 2022 robocom 世界机器人开发者大赛-本科组(国赛)
    RC-u1智能红绿灯题目描述:RC-u1智能红绿灯为了最大化通行效率同时照顾老年人穿行马路,在某养老社区前,某科技公司设置了一个智能红绿灯。这个红绿灯是这样设计的:路的两旁设置了一个按钮,老年人希望通行马路时会按下按钮;在没有人按按钮的时候,红绿灯一直为绿灯;当红绿灯为绿灯......
  • Robocom训练摘记
    目录2021RoboCom机器人开发者大赛(初赛)2021RoboCom机器人开发者大赛(复赛)拼题A打卡奖励2021RoboCom机器人开发者大赛(初赛)pta题解2021RoboCom机器人开发者大赛(复赛)pta题解拼题A打卡奖励题面:题意:普通背包问题。你有m的时间可以做n张打卡卷,做完第i张打卡卷需要\(m_i......
  • 2022 RoboCom 世界机器人开发者大赛-高职组(省赛)
    RC-v1您好呀print("NinHaoYa~")RC-v2爷爷奶奶您好呀#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongint32_tmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);stringa,b,c;cin>......
  • 2021 robocom 世界机器人开发者大赛-本科组(初赛)
    7-1懂得都懂题目描述:7-1懂的都懂众所周知,在互联网上有很多话是不好直接说出来的,不过一些模糊的图片仍然能让网友看懂你在说什么。然而对这种言论依然一定要出重拳,所以请你实现一个简单的匹配算法。现在我们采集了原图的一些特征数据,由N个小于255的非负整数组成,假设对于......
  • 2022 RoboCom 世界机器人开发者大赛-本科组(省赛)
    RC-u1不要浪费金币#include<bits/stdc++.h>usingnamespacestd;intmain(){ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);intn,m,res=0;cin>>n>>m;for(inti=1,cnt=0,x;i<=n;......
  • 2022 RoboCom 世界机器人开发者大赛-本科组(国赛)个人题解
    RC-u4变牛的最快方法思路最短编辑距离+记录路径板子题,不懂最短编辑距离的可以看看网上的博客。不懂为什么官方题解用的bfs写法,然后网上所有的题解就是bfs了。我这里就是双重for循环实现,参考下写法即可。代码点击查看代码#include<bits/stdc++.h>#definexfirst#definey......
  • 2023 SMU RoboCom-CAIP 选拔赛
    A.小斧头  #include<map>#include<set>#include<cmath>#include<queue>#include<stack>#include<cstdio>#include<vector>#include<climits>#include<cstring>#include<cstdlib>......
  • 2023 SMU RoboCom-CAIP 选拔赛
    2023SMURoboCom-CAIP选拔赛A-小斧头思路:70分由于区间范围越大,最大值越大,st表存区间最大值,枚举bi的值作为[l,r]内最大值,可用二分求出l,r的范围(左边求小于bi,右边求小于等于bi,这样可以得到所有的可能)#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>......
  • 2023 SMU RoboCom-CAIP 选拔赛
    A.小斧头\(O(N^3)\)20points暴力枚举左右端点,然后暴力求区间最值#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongintread(){...}int32_tmain(){intn=read(),res=0;vector<int>a(n),b(n);for(auto&i:a)i......