题目来源: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;
}