第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结

今年首次参加传智杯,刚比完蓝桥杯所以打传智杯比较轻松,一个五道题,AC了五道题,还算不错
第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第1张图片

很可惜,罚时少点应该就是一等了

今年题目相对于前两届较为简单,但是还是有很大细节会影响得分,过程中几乎每道题我都罚了时,下面对题目进行一个总结

第三届传智杯题解

  • A - 课程报名
  • B - 期末考试成绩
  • C - 志愿者
  • D - 终端
  • E - 运气

A - 课程报名

第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第2张图片
第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第3张图片

题解
这个题比较简单,只需要简单模拟即可,比赛时罚时了两次,开始用(人数%m==0)判断是否需要提升定价,后来改用变量计数成功AC

#include
#include
using namespace std;
long long n,v,m,a;
int main(){
	cin>>n>>v>>m>>a;
	int count = 0;//报名人数
	int sum = 0 ;//学费和
	int xueyuan = 0; //记录是否报了m个学员
	while(count<n){
		if(xueyuan==m){//报到了m个学员
			v+=a;//定价提升a元
			xueyuan=0;//学员数重置
		}
		sum+=v;//计算学费
		xueyuan++;
		count++;
	}
	printf("%d\n",sum);
	return 0;
}

B - 期末考试成绩

第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第4张图片
第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第5张图片
题解
一道模拟题,根据题目转化为相应的代码就可以了,注意的是向下取整

#include
#include
#include
using namespace std;
int score;
double GFA;
int main(){
	cin>>score;
	if(score>=90){
		GFA=4.0;
	}else if(score>=60&&score<=89){
		int chazhi = 90 - score;
		GFA = 4.0-0.1*chazhi;
	}else if(score<60){
		int newscore = floor(sqrt(score)*(double)10);
		if(newscore>=90){
			GFA=4.0;
		}else if(newscore>=60&&newscore<=89){
			int chazhi = 90 - newscore;
			GFA = 4.0-0.1*chazhi;
		}else if(score<60){
			GFA = 0;
		}
		
	}
	printf("%.1f",GFA);
	return 0;
}

C - 志愿者

第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第6张图片
第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第7张图片
题解
一道排序题,只要会sort自定义排序方式会非常简单

#include
#include
#include
using namespace std;
long long n; 
struct node{
	long long t,k,g,id;
};
node a[10000000];
bool cmp(node a,node b){//自定义排序方式
	if(a.g!=b.g)return a.g>b.g;//按贡献排序
	else if(a.t!=b.t)return a.t>b.t;//按时长排序
	else if(a.id!=b.id)return a.id<b.id;//按照编号排序
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i].t>>a[i].k;
		a[i].id=i+1;//给每一个人编号,以免排序打乱编号
	}
	for(int i=0;i<n;i++){//贡献度计算出存入
		a[i].g=a[i].k*a[i].t;
	}
	stable_sort(a,a+n,cmp);//使用稳定排序
	for(int i=0;i<n;i++){
		printf("%lld ",a[i].id); 
	}
	return 0;
}

D - 终端

第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第8张图片
第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第9张图片题解
这题出题方的锅,真没想到举办反是真不上心,测试数据居然没有提前测出有问题
使用set会相对简单一些,但是要注意一些细节,删除要判断是否存在文件,修改文件要判断是否重名,添加文件要判断是否重名

#include
#include
#include
using namespace std;
int ttime=0;
struct node{
	string s;//保存字符串
	int t;//保存创建时间
	bool operator<(const node &rhs)const{//重载运算符,按时间排序
		if(t!=rhs.t){
			return t<rhs.t;
		}else{
			return s<rhs.s;
		}
	}
	node(string ss,int tt){
		s = ss;
		t = tt;
	}
	
};
int n;
set<node> se;
//创建文件
void add(string s){
	//存在同名 
	for(set<node>::iterator it = se.begin();it!=se.end();it++){
		if((*it).s==s){
			return;
		}
	}
	ttime++;
	se.insert(node(s,ttime));//创建文件和记录时间
}
//删除文件
void delate(string s){
	int flag=false;
	//查看是否存在文件s 
	for(set<node>::iterator it = se.begin();it!=se.end();it++){
		if((*it).s==s){
			flag=true;
			break;
		}
	}
	if(flag){
		for(set<node>::iterator it = se.begin();it!=se.end();it++){
			if((*it).s==s){
				se.erase(it);//删除文件
				break;
			}
		}
	}
	
}
//ls查询操作
void prit(){
//保证存在文件
	if(se.size()>0){
		for(set<node>::iterator it = se.begin();it!=se.end();it++){
			cout<<(*it).s<<endl;
		}
	}
	
}
//更新文件名(先删除在添加实现)
void update(string a,string b){
	int ti=0;
	//检测是否存在同名 
	for(set<node>::iterator it = se.begin();it!=se.end();it++){
		if((*it).s==b){
			return;
		}
	}
	int flag=false;//保证修改文件存在
	for(set<node>::iterator it = se.begin();it!=se.end();it++){
		if((*it).s==a){
			flag=true;
			ti = (*it).t ;
			se.erase(it);
			break;
		}
	}
	if(flag){
		se.insert(node(b,ti));
	}
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		string s;
		cin>>s;
		if(s=="touch"){//添加文件 
			string st;
			cin>>st;
			add(st);
		}else if(s=="rm"){//删除文件 
			string st;
			cin>>st;
			delate(st);
		}else if(s=="ls"){//输出排序 
			prit();
		}else if(s=="rename"){//改名 
			string a,b;
			cin>>a>>b;
			update(a,b);
		}
	}
	return 0;
}

E - 运气

第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第10张图片
第三届“传智杯”全国大学生IT技能大赛(初赛)B组赛后总结_第11张图片
题解
这应该是这次比赛唯一考了算法的一道题,最简单的搜索,但是考试的时候想复杂了反而被罚时

#include
#include
#include
using namespace std;
long long n,k,ans;
void dfs(int fg,long long sum){//第fg枚筛子,当前组成了数字sum
	if(fg==n){//所有塞子抛完
		if(sum%k==0){//判断是不是k的倍数
			ans++;
		}
		return;
	}
	for(int i=1;i<=6;i++){//一到六点选一点
		dfs(fg+1,sum*10+i);
	}
}
int main(){
	cin>>n>>k;
	dfs(0,0);
	printf("%lld",ans);
	return 0;
}

能力有限会有不足,欢迎大家提出!!!

你可能感兴趣的:(C/C++竞赛笔记,算法,数据结构,c++)