sdacm20240503 A G J K M 题解(The 17-th BIT Campus Programming Contest - Onsite Round)

题目来源:Dashboard - The 17-th BIT Campus Programming Contest - Onsite Round - Codeforces

A题:填空题(签到题),没啥好说的。

实现代码:

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
using namespace std;
const int N=1e6+5;
void solve(){
	cout << "A" << endl;
	cout << "C" << endl;
	cout << "A" << endl;
	cout << "C" << endl;
	cout << "A" << endl;
	cout << "C" << endl;
	cout << "A" << endl;
	cout << "C" << endl;
	cout << "A" << endl;
	cout << "C" << endl;
	return ;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t;
	//cin >> t;
	//while(t--) 
	solve();
	return 0;
}

K题:求一个整数d在str进制下的表示。

**解题思路:**签到题,将整数d倒着求余str字符串,最后倒着输出求余的结果即可。

实现代码:

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
using namespace std;
const int N=1e6+5;
int a[N];
void solve(){
	int m,n;
	cin >> m >> n;
	string s;
	cin >> s;
	int d;cin >> d;
	int k=0;
	int len=s.size()-1;
	while(m--){
		a[k++]=d%(s[len]-'0');
		d=d/(s[len]-'0');
		--len;
	}
	for(int i=k-1;i>=0;--i){
		cout << a[i];
	}
	return ;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t;
	//cin >> t;
	//while(t--) 
	solve();
	return 0;
}

G题:求最少消耗的装备。

解题思路:贪心算法,遍历所有格子先消除面临敌人最多的格子,最后消除面临敌人最少的格子即可。

实现代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int m,n,sum,st[1005][1005],cnt;
int main()
{
	cin>>m>>n;
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			cin>>st[i][j];
		}
	}
	for(int k=5;k>=1;k--)//开3重循环
	{
		for(int i=1;i<=m;i++)
	    {
		    for(int j=1;j<=n;j++)
		    {
		    	cnt=0;
		     if(st[i][j]==1)
			 cnt=st[i][j]+st[i-1][j]+st[i][j-1]+st[i][j+1]+st[i+1][j];
			 if(cnt==k)
			 {
			 	sum+=cnt;
			 	st[i][j]=0;
			 }
		    }
	    }
	}
	cout<<sum<<endl;
	return 0;
}

M题:更改一串字符串其中一个字符,使这个字符串满意程度最大。

解题思路:从头开始截取s字符串,然后遍历截取后的子字符串,将子字符串每个字符都换为字符‘z’并比较,找出最大的子字符串。

实现代码:

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
using namespace std;
void solve(){
	int n;
	string s;
	cin >> n >> s;
	string s1=s;//定义初始字符串为s字符串
	for(int i=0;i<s.size();++i){
		string s2=s.substr(i);//截取子字符串
		for(int j=0;j<s2.size();++j){
			if(s2[j]=='z') continue;
			char t=s2[j];//将子字符串每个字符更改为z
			s2[j]='z';
			if(s2>s1) s1=s2;
			s2[j]=t;	//更改完后回溯
		}
	}					
	cout << s1;
	return ;
}
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t;
	//cin >> t;
	//while(t--) 
	solve();
	return 0;
}

J题:求是否需要参数c,不需要则输出0,需要则输出参数c,若数据无法通过则直接输出-1。

解题思路:考数学思维,若a>w则车可以直线通过,不需要参数c,反之,若w<=b则车不能到墙边,则直接输出-1,找出w,b以及它们所围成底边边界l,若l-a<=0,则不需要参数c,大于0则用相似三角形算出参数c。

实现代码:

#include<bits/stdc++.h>
#define int long long 
#define endl "\n"
using namespace std;
const int N=1e6+5;
void solve(){
	double ans=0;
	double a,b,h,w;
	cin >> a >> b >> h >> w;
	if(a>w){//若汽车可以直线通过
		printf("%.10f\n",ans);
		return ;
	}
	else{
		if(w<=b){//汽车既不能直线通过也不能沿墙通过
			printf("-1\n");
			return ; 
		}
		double l=sqrt(w*w-b*b)-a;//找出底边l的边界
		if(l<=0){//若l-a小于等于0,说明汽车不需要参数c也能沿墙走
			printf("%.10f\n",ans);
		    return ;
		}
		else{
			ans=b*l/w;//用相似三角形求出c
			printf("%.10f\n",ans);
		    return ;
		}
	}
	return ;
}
signed main(){
	//ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t;
	cin >> t;
	while(t--) 
	solve();
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值