2021年第三届计算机能力挑战赛C++决赛试题

2021年第三届计算机能力挑战赛C++决赛试题

前言

下面代码都是自己写的,因为做题系统不能立马给出代码的通过情况。所以可能存在有些条件考虑不全面的问题。若发现代码有误,欢迎在评论区指出哦~

题目

1:
在这里插入图片描述

分析:这道题,判断回文就OK

#include <iostream> 
#include <iomanip>
#include <cstring>
#include <algorithm>
#include <sstream>
using namespace std;

bool judge(int value){
	stringstream ss;
	ss<<value;
	string str;
	ss>>str;
	int len=str.length();
	string s="";
	for (int i=len-1;i>=0;i--){
		s+=str[i];
	}
	if (s==str){
		return true;
	}
	return false;
}

int main()
{
	int l,r,k;
	cin>>l>>r>>k;
	int ans=0;
	for (int i=l;i<=r;i++){
		if (judge(i)&&i%k==3){
			ans++;
		}
	}
	cout<<ans;
}

2:
在这里插入图片描述

分析:这道题我用的是全部枚举,总共16种情况,这个方法有点笨~ 做到一半突然发现可以用数组来存运算符,依次遍历这些运算符,可能代码要简洁点。

#include <iostream> 
#include <iomanip>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <set>
using namespace std;

int main()
{
	// a+b?c?d
	int a,b,c,d;
	cin>>a>>b>>c>>d;
	set<int>s;
	int value1=a+b+c-d;
	int value2=a+b+c*d;
	int value3=a+b+c/d;
	int value4=a+b-c+d;
	int value5=a+b-c*d;
	int value6=a+b-c/d;
	int value7=a+b*c+d;
	int value8=a+b*c-d;
	int value9=a+b*c/d;
	int value10=a+b/c+d;
	int value11=a+b/c-d;
	int value12=a+b/c*d;
	int value13=a+b+c+d;
	int value14=a+b-c-d;
	int value15=a+b*c*d;
	int value16=a+b/c/d;
	s.insert(value1);
	s.insert(value2);
	s.insert(value3);
	s.insert(value4);
	s.insert(value5);
	s.insert(value6);
	s.insert(value7);
	s.insert(value8);
	s.insert(value9);
	s.insert(value10);
	s.insert(value11);
	s.insert(value12);
	s.insert(value13);
	s.insert(value14);
	s.insert(value15);
	s.insert(value16);
	cout<<s.size();
}

3:
在这里插入图片描述
分析:这个题的话,用优先队列就好了。优先队列存的是相邻柱子的距离,每次找出最大的距离,若要添加柱子,只能加在最大距离之间,而且最好是在最大距离的中间。还要注意距离包括从0点,也就是原点到第一颗柱子的距离和最后一颗柱子到终点的距离。

#include <iostream> 
#include <iomanip>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <set>
#include <queue>
using namespace std;

int main()
{
	priority_queue<int>q;
	int len,n,m;
	cin>>len>>n>>m;
	int a[n+2];
	a[0]=0;a[n+1]=len;
	for (int i=1;i<=n;i++){
		cin>>a[i];
	}
	for (int i=1;i<n+2;i++){
		q.push(a[i]-a[i-1]);
	}
	for (int i=0;i<m;i++){
		int value=q.top();
		q.pop();
		q.push(value/2);
		q.push(value-value/2);
	}
	cout<<q.top();
}

4:
在这里插入图片描述
分析:这个题就是用struct或者class,题目没明确告诉前N个是客户端,但我把它默认成前N个是客户端了,emm

大概思路是这样:用map来匹配info和str,用map的好处是快速找到str对应的客户端,比较方便。

比较坑的是代码段的a[i].tt=i;必须要在mmp[a[i].str]=a[i];之前,否则后面int t=temp.tt;这句话得到的t不是下标,多仔细点就OK。

#include <iostream> 
#include <iomanip>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <set>
#include <cmath>
#include <map>
using namespace std;

struct info{
	string str;
	char ch;
	string number;
	int x,y;
	double dis;
	int tt;//第几个 
	string match;//匹配的 
};

bool cmp(info a1,info a2){//递增 
	return a1.number<a2.number;
}

int main()
{
	int n;
	cin>>n;
	map<string,info>mmp;
	info a[n];
	for (int i=0;i<2*n;i++){
		if (i<n){
			cin>>a[i].str>>a[i].ch>>a[i].number>>a[i].x>>a[i].y;
			a[i].tt=i;
			mmp[a[i].str]=a[i];
		}
		else{
			string str,number;
			char ch;
			int x,y;
			cin>>str>>ch>>number>>x>>y;
			info temp=mmp[str];
			double distance=sqrt((temp.x-x)*(temp.x-x)+
			(temp.y-y)*(temp.y-y));
			temp.dis=distance;
			temp.match=number;
			int t=temp.tt;
			a[t]=temp;
		}		
	}
	sort(a,a+n,cmp);
	cout<<setiosflags(ios::fixed)<<setprecision(2);
	for (int i=0;i<n;i++){
		cout<<a[i].number<<" "<<a[i].match<<" "<<a[i].dis<<endl;
	}
	return 0;
}

5:
在这里插入图片描述在这里插入图片描述
分析:这个题把设置陷阱的位置按递减排个序就Ok,每次都取离起点距离最大的陷阱,可以保证得到的陷阱数最少

#include <iostream> 
#include <iomanip>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <set>
#include <cmath>
#include <map>
using namespace std;

bool cmp(int a,int b){
	return a>b;
}

int main()
{
	int n,l,v;
	cin>>n>>l>>v;
	int a[n];
	for (int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n,cmp);//递减
	//cout<<a[0];
	int q;
	cin>>q;
	for (int i=0;i<q;i++){
		int j;
		cin>>j;
		if (j<l*1.0/v){
			cout<<"0"<<endl;
		}
		else{
			int cnt=0;
			int len=l;
			bool flag=false;
			for (int k=0;k<n;k++){
				len+=a[k];
				cnt++;
				double time=len*1.0/v;
				if (j<time){
					flag=true;
					cout<<cnt<<endl;
					break;
				}
			}
			if (!flag){
				cout<<"-1"<<endl;
			}
		}
	}
	return 0;
}

最后

本人菜鸡一枚,可能有很多错误或者没考虑到的地方,若有大佬发现后,请不吝赐教,欢迎在评论区指出~~

  • 2
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值