北京理工大学第十七届程序设计竞赛决赛

A. 赛前须知
输出ACACACACAC即可

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long

int main(){
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    string s="ACACACACAC";
    for(int i=0;i<s.size();i++) cout<<s[i]<<endl;
    return 0;
}

G. 小P玩钢4
1.先在输入的时候计算有多少个1,即本身需要花费的代价
2.然后再遍历一次,计算每个1周围有多少个1,ans加上相应的数量,把这个遍历过的1赋值为0,这样做的原理是因为,一个联通块1你从哪个点开始去遍历,要计算这个块总体的每个1(遍历过后改为0)周围有多少个1结果是一样的

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};

void solve()
{
    int n,m,ans=0;
    cin>>n>>m;
    int a[n][m];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++) 
        {
            cin>>a[i][j];
            if(a[i][j]==1) ans++;
        }
    }
    
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            
            if(a[i][j]==1)
            {
               for(int k=0;k<4;k++)
               {
                   int xx=i+dx[k],yy=j+dy[k];
                   if(a[xx][yy]==1&&xx>=0&&xx<n&&yy>=0&&yy<m){
                       ans++;
                     
                   }
               }
                a[i][j]=0;
            }
        }
    }
    
    cout<<ans;
    
    
}


signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

K. str进制

简单的模拟进制,取余,整除,翻转即可

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};

void solve()
{
    int n,m;
    cin>>n>>m;
    string s; cin>>s;
    int d; cin>>d;
    
    string ans;
    for(int i=n-1;i>=0;i--)
    {
        ans+=(d%(s[i]-'0'))+'0';
        d/=(s[i]-'0');
    }
    reverse(ans.begin(),ans.end());
    cout<<ans;
    
}


signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

M. 小H的糖果
1.每次只允许改一个字母,然后要我们找出只改一次后的最大字典序的字符串
2.直接暴力,从头开始截取子串,找到第一个不是z的,将其改字母为z,然后比较找到最大的即可

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};

void solve()
{
    int n; cin>>n;
    string s; cin>>s;
    string ans=s;
    for(int i=0;i<n;i++)
    {
        string sb=s.substr(i);
        for(int j=0;j<sb.size();j++)
        {
            if(sb[j]!='z') 
            {
                sb[j]='z';
                break;
            }
        }
        if(sb>ans) ans=sb;
    }
    cout<<ans;
    
}


signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

J. pass
1.a>w,路面宽度大于车底盘宽度,可以直接过
2.a<w, 当w<=b的时候车最极端是竖起来肯定不行,所以是-1,当w>b的时候,我们算w在地面上的投影,l=sqrt(w*w-b * b ),如果l<=a,说明车的右端可以在墙顶面的最左侧,轮胎高度理想化四舍五入为0,如果l>a,则车的左端应该在路面的最最左侧,我们延伸这个底面这条线至地面,在地上两个直角三角形相似得结果,小直角三角形的斜边就是l-a

点击查看代码
using namespace std;
#define int long long 
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()


void solve()
{
	int a,b,h,w;//a为路宽,b为墙高,h为车高,w为车宽 
	cin>>a>>b>>h>>w;
	double ans=0;
	if(a>w) ans=0;
	else {
		if(w<=b) ans=-1; 
		else {
			double l=sqrt(w*w-b*b);
			if(l<=a) ans=0;
			else ans=(b*(l-a))/w;
		}
		
	}
	if(ans!=-1)	cout<<fixed<<setprecision(10)<<ans<<endl;
	else cout<<-1<<endl;
}


signed main()
{
	
    int t=1;
   	cin>>t;
    while(t-- ) solve();
    return 0;
}

posted on 2024-06-16 15:40  swj2529411658  阅读(10)  评论(0编辑  收藏  举报

导航