牛客周賽 Round 40

ataraxyyeah發表於2024-04-18

A 小紅進地下城

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s,t;
	cin>>s;
	cin>>t;
	if(s==t)
	{
		cout<<"Yes"<<endl;
	}
	else
	{
		cout<<"No"<<endl;
	}
	return 0;
}

B 小紅打怪

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
char mm[1005][1005];
int flag[1005][1005];
int main()
{
	int n,m;
	cin>>n>>m;
	int xi,yi;
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=m;++j)
		{
			cin>>mm[i][j];
			if(mm[i][j]=='A')
            {
                xi=i,yi=j;
            }
            else if(mm[i][j]=='W')
            {
                xi=i,yi=j;
            }
            else if(mm[i][j]=='S')
            {
                xi=i,yi=j;
            }
            else if(mm[i][j]=='D')
            {
                xi=i,yi=j;
            }
		}
	}
	int ans=0;
	if(mm[xi][yi]=='A')
    {
        for(int i=1;i<=yi;++i)
        {
            if(mm[xi][i]=='*')ans++;
        }
    }
    else if(mm[xi][yi]=='W')
    {
        for(int i=1;i<=xi;++i)
        {
            if(mm[i][yi]=='*')ans++;
        }
    }
    else if(mm[xi][yi]=='S')
    {
        for(int i=xi;i<=n;++i)
        {
            if(mm[i][yi]=='*')ans++;
        }
    }
    else if(mm[xi][yi]=='D')
    {
        for(int i=yi;i<=m;i++)
        {
            if(mm[xi][i]=='*')ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

C 小紅的排列構造

開兩個陣列判斷數字是否在 \(p\)\(q\) 排列中出現過,如果都出現過,直接輸出 -1 ,然後對於排列 \(p\)\(q\) 中那些空缺的位置,遍歷沒有被填的數,然後填上

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn],p[maxn],q[maxn],t1[maxn],t2[maxn];
int main()
{
    int n;
    int j1=1,j2=1;
    cin>>n;
    int jud=0;
    for(int i=1;i<=n;++i)
    {
        cin>>a[i];
        if(!t1[a[i]])p[i]=a[i],t1[a[i]]=1;
        else if(!t2[a[i]])q[i]=a[i],t2[a[i]]=1;
        else jud=1;
    }
    if(jud)return cout<<-1,0;
    for(int i=1;i<=n;++i)
    {
        if(!p[i])
        {
            while(t1[j1])j1++;
            p[i]=j1;
            t1[j1]=1;
        }
        if(!q[i])
        {
            while(t2[j2])j2++;
            q[i]=j2;
            t2[j2]=1;
        }
    }
    for(int i=1;i<=n;++i)cout<<p[i]<<" ";
    cout<<endl;
    for(int i=1;i<=n;++i)cout<<q[i]<<" ";
    cout<<endl;
    return 0;
}

D 小紅升裝備

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll dp[305][305];
//dp[i][j]為考慮前i件裝備,使用金幣數不超過j時,可以獲得的最大戰力
int main()
{
    int n,x;
    cin>>n>>x;
    memset(dp,-0x3f,sizeof dp);
    dp[0][0]=0;
    ll res=0;
    for(int i=1;i<=n;++i)//遍歷每一件裝備
    {
        ll a,b,c,d,e;
        cin>>a>>b>>c>>d>>e;
        for(int j=0;j<=x;++j)
        {
            dp[i][j]=dp[i-1][j];
        }
        for(int k=0;k<=x;++k)//遍歷金幣數
        {
            for(int j=0;j<=e;++j)//遍歷升的級
            {
                if(b+c*j>k)break;
                dp[i][k]=max(dp[i][k],dp[i-1][k-(b+c*j)]+a+j*d);
                res=max(res,dp[i][k]);
            }
        }
    }
    cout<<res<<endl;
    return 0;
}

E 小紅的矩陣劃分

首先,有引理,如果 \(n\) 是 3 的倍數,則一定可以填滿,如果 \(n\) 不是 3 的倍數,則一定有一種方案可以做到只剩一個方塊

因此當 \(n\) 為 3 的倍數時,選擇 \(L\) 型或正方形中的一種填滿即可,\(n\) 不為 3 的倍數時,比較最後一個塊的方案

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
{
    ll n,x,y;
    cin>>n>>x>>y;
    if(n%3==0)
    {
        cout<<max(n*n/3*x,n*n/4*y);
    }
    else
    {
        cout<<max({n*n/3*x,n*n/4*y,n*n/3*x-x+y});
    }
    cout<<endl;
    return 0;
}

F 小紅拿寶箱

相關文章