北华大学计算机程序设计算法提高训练营个人赛(个人题解)

比赛链接:北华大学计算机程序设计算法提高训练营个人赛

A洛姐打题日记:

map模拟即可

map<string,string>mp;
int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	string s;
	cin>>s;
	mp["AC"]="Accepted";
	mp["WA"]="Wrong Answer";
	mp["RE"]="Runtime Error";
	mp["TLE"]="Time Limit Exceeded";
	mp["PE"]="Presentation Error";
	mp["MLE"]="Memory Limit Exceeded";
	mp["CE"]="Compile Error";
	cout<<mp[s]<<endl;
	return 0;
}

B鸡兔同笼:

设有a只鸡,b只兔,那么:

1.a+b=H  

2.a*x+b*y=F 

对式1变形:b=H-a,带入式2得:a=(F-H*y)/(x-y)

int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	int t;
	cin>>t;
	while(t--){
		ll x,y,h,f;
		cin>>x>>y>>h>>f;
		ll a=(f-h*y)/(x-y);
		cout<<a<<" "<<h-a<<endl;
	}
	return 0;
}

C小杜的签到:

显然使得第1和第n为最大与最小即可,求一下数组最大/最小值即可

ll a[N];
int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	int n;
	cin>>n;
	ll maxn=-inf,minn=inf;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		maxn=max(maxn,a[i]);
		minn=min(minn,a[i]);
	}
	cout<<minn-maxn<<" "<<maxn-minn<<endl;
	return 0;
}

D我超!原!:

欺负我没玩过原神,一直以为每一级都有溢出,计算总溢出,最后罚座了两个小时才发现当前如果有溢出可以留作下一级用。。。。

水题,显然最后一定有三种情况,即只有a材料,或者只有a,b材料,以及三种材料都有的情况,注意特判x=1时(这个害我wa了好多发)

int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	ll x,y,a,b,c;
	cin>>x>>y>>a>>b>>c;
	if(x==1){
		cout<<0<<endl;
		return 0;
	}
	ll base=1000;
	ll sum=base;
	ll ba=20000,bb=5000,bc=1000;
	for(int i=2;i<x;i++){
		base+=y;
		sum+=base;
	}
	ll ans=1e18;
	if(ba*a+bb*b+bc*c<sum){
		cout<<"QAQ"<<endl;
	}
	else{
		if(ba*a>=sum){
			ll tmp=ba-sum%ba;
			tmp%=ba;
			ans=min(ans,tmp);
		}
	 	ll res=sum/ba;
		res=min(res,a);
		sum-=res*ba;
		if(bb*b>=sum){
			ll tmp=bb-sum%bb;
			tmp%=bb;
			ans=min(ans,tmp);
		}
		res=sum/bb;
		res=min(res,b);
		sum-=res*bb;
		if(c*bc>=sum){
			ll tmp=bc-sum%bc;
			tmp%=bc;
			ans=min(ans,tmp);
		}
		cout<<ans<<endl;
	}
	return 0;
}

E佳乐的迷宫:

从出口跑bfs即可,看看有多少个入口可以跑到

int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
char c[1010][1010];
int score[1010][1010];
int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	int n,m,k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>c[i][j];
		}
	}
	for(int i=1;i<=k;i++){
		int x,y;
		cin>>x>>y;
		score[x][y]=i;
	}
	queue<int>qx,qy;
	int sx,sy;
	cin>>sx>>sy;
	qx.push(sx);qy.push(sy);
	vector<int>ans;
	while(qx.size()){
		int fx=qx.front();
		int fy=qy.front();
		qx.pop();
		qy.pop();
		for(int i=0;i<4;i++){
			int tx=fx+dx[i],ty=fy+dy[i];
			if(tx>=0&&tx<=n&&ty>=0&&ty<=m&&c[tx][ty]=='.'&&score[tx][ty]!=-1){
				if(score[tx][ty]){
					ans.emplace_back(score[tx][ty]);
				}
				score[tx][ty]=-1;
				qx.push(tx);
				qy.push(ty);
			}
		}
	}
	sort(ans.begin(),ans.end());
	cout<<ans.size()<<endl;
	for(int i=0;i<ans.size();i++){
		cout<<ans[i]<<" ";
	}
	cout<<endl;
	return 0;
}

F三四五:

经典博弈论的变形,考虑第一组,我们发现不论先手选几后手都可以使得二者取完后总共取了4个石子,所以单调考虑第一组当石头是4的倍数时后手必胜,否则先手胜,但是这有前提条件,即当前组在取完前别的组必须还没有分出胜负,否则当前组就算必胜,但是别的组已经取完了那么当前组就无法决定战局,因此再判断下别的组是否取完即可,后两组也同样判断下即可

int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	int t;
	cin>>t;
	while(t--){
		ll a,b,c;
		cin>>a>>b>>c;
		ll x=a/4,y=b/5,z=c/6;
		if(a%4==0&&x<=min(y,z)||b%5==0&&y<=min(x,z)||c%6==0&&z<=min(y,x)){
			cout<<"(T-T)"<<endl;
		}
		else{
			cout<<"(^-^)"<<endl;
		}
	}
	return 0;
}

G杰哥的疑问:

map记录下出现次数,对每个元素看看已经出现了多少个可以配对的,求总和即可

map<int,int>mp; 
//emplace_back() 
int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	int n,m;
	cin>>n>>m;
	ll ans=0;
	for(int i=1;i<=n;i++){
		int d;
		cin>>d;
		ans+=mp[m-d];
		mp[d]++;
	}
	cout<<ans<<endl;
	return 0;
}

H墨染的斯汀木:

这题一定要注意先把第二个字符串的大写字母全部变成小写后再和A进行模拟配对,其他就是模拟没什么没东西了

int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	string s1,s2;
	cin>>s1>>s2;
	string ss2="";
	for(int i=0;i<s2.length();i++){
		if(s2[i]<='Z'){
			ss2+=s2[i]+32;
			ss2+=s2[i]+32;
		}
		else{
			ss2+=s2[i];
		}
	}
	int l=0;
	for(int i=0;i<s1.length();i++,l++){
		if(s1[i]==ss2[l]){
			continue;
		}
		else if(s1[i]=='?'){
			s1[i]=ss2[l];
		}
		else if(s1[i]=='!'){
			s1[i]=ss2[l]-32;
			l++;
		}
		else{
			l++;
		}
	}
	cout<<s1<<endl;
	return 0;
}

I,JDarling:

用dis[i][0/1]表示当前点距离最近的雌性/雄性的距离,初始化各点后都放入队列跑bfs即可

int lei[N];
int vis[N];
int dis[N][2];
vector<int>e[N];
int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	int n,m,t;
	cin>>n>>m>>t;
	for(int i=1;i<=n;i++){
		dis[i][0]=dis[i][1]=inf;
		cin>>lei[i];
		dis[i][lei[i]]=0;
	}
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		e[u].emplace_back(v);
		e[v].emplace_back(u);
	}
	queue<int>q;
	for(int i=1;i<=n;i++){
		q.push(i);
		vis[i]=1;
	}
	while(q.size()){
		int f=q.front();
		q.pop();
		vis[f]=0;
		for(int i=0;i<e[f].size();i++){
			int tmp=e[f][i];
			if(dis[f][0]+1<dis[tmp][0]){
				dis[tmp][0]=dis[f][0]+1;
				if(!vis[tmp]){
					vis[tmp]=1;
					q.push(tmp);
				}
			}
			if(dis[f][1]+1<dis[tmp][1]){
				dis[tmp][1]=dis[f][1]+1;
				if(!vis[tmp]){
					vis[tmp]=1;
					q.push(tmp);
				}
			}
		}
	}
	while(t--){
		int q;
		cin>>q;
		int ans;
		if(lei[q]){
			ans=dis[q][0];
		}
		else{
			ans=dis[q][1];
		}
		if(ans>1e9){
			ans=-1;
		}
		cout<<ans<<endl;
	}
	return 0;
}

K小杜返校记:

纯纯模拟

map<string,int>mp;
double p[10][10];
int main(){
/*cout<<setiosflags(ios::fixed)<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(不含整数部分)*/
/*cout<<setprecision(8)<<ans<<endl;//输出ans(float)格式控制为8位小数(含整数部分)*/
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//同步流
	mp["First Class"]=1;
	mp["Business Class"]=2;
	mp["Economy Class"]=3;
	double n,t;
	cin>>n>>t;
	string s,s1;
	cin>>s>>s1;
	s+=" "+s1;
	for(int i=1;i<=3;i++){
		for(int j=1;j<=3;j++){
			cin>>p[i][j];
		}
	}
	double ans;
	if(t>=336){
		ans=0;
	}
	else if(t>=48){
		ans=n*p[mp[s]][1]/100.0;
	}
	else if(t>=4){
		ans=n*p[mp[s]][2]/100.0;
	}
	else{
		ans=n*p[mp[s]][3]/100.0;
	}
	ans=n-ans;
	cout<<setiosflags(ios::fixed)<<setprecision(2)<<ans<<endl;
	return 0;
}

L不会,据队友说是克鲁斯卡尔重构树,表示没学过就摸鱼了

总体上来说这场比赛还是比较简单的,除了D的特判其他都是比较亲民的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值