2024年闽南师范大学ACM集训队选拔【题解完成】

93 阅读4分钟
题目难度知识点
A 茂炮牌旭★★模拟冒泡排序
B 补药挂科模拟
C 圆神启动推式子
D 学霸题模拟
E 美人鱼的骰子贪心
F 跳一跳★★模拟
G 能量饮料模拟
H 三消bingo模拟
I 你方不方★★博弈论
J 除三操作★★数学



image.png 挺简单的一套题,但是没能AK,一道是博弈论但是懒得想了,一道是模拟,想的是建图暴力高T了。我觉得是不是打一些这种场挺爽的,但是提升很小罢了。

茂炮牌旭

image.png

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n;
        string a;
        cin>>n>>a;
        string b="mnsfdx";
        int cnt=0;
        for(int i=0;i<b.size();i++)
        {
            string c=a.substr(i);
            int j=c.find(b[i]);
            if(j==-1) break;
            j=i+j;
            for(int l=j;l-1>=i;l--) swap(a[l-1],a[l]),cnt++;
        }
        if(a==b) cout<<cnt<<endl;
        else cout<<"-1"<<'\n';
    }
    return 0;
}

补药挂科

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
double a[N],b[N],n,m;
int main(void)
{
    cin>>n;
    double sum=0;
    for(int i=0;i<n;i++) cin>>a[i],sum+=a[i];
    cin>>m;
    for(int i=0;i<m;i++) cin>>b[i],sum+=b[i];
    sum=sum/(m+n)*0.3;
    double ans=(60-sum)/0.7;
    printf("%d",(int)ceil(ans));
    return 0;
}

圆神启动

image.png

image.png

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e3+10;
LL a[N]={0,2,4,8},s[N]={0,2,4,8},n;
int main(void)
{
    cin>>n;
    cout<<n*(n+1)-2*(n-1);
    return 0;
}

学霸题

image.png

#include<bits/stdc++.h>
using namespace std;
int a[105][105],n,m;
int main(void)
{
    int ans=0;
    cin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++) cin>>a[i][j],ans+=a[i][j];
    cout<<ans;
    return 0;
}

美人鱼的骰子

image.png

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int n; cin>>n;
    int ans=n/11;
    ans=ans*2;
    int temp=n%11;
    if(temp>=1&&temp<=6) ans++;
    if(temp>=7) ans+=2;
    cout<<ans;
    return 0;
}

跳一跳

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char a[N];
int t,n,m,k;
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>k;
        int cnt=0;
        for(int i=1;i<=n;i++) cin>>a[i];
        a[n+1]='L',a[0]='L',a[n+2]='L';
        int i=0;
        while(i<=n+1)
        {
            if(a[i]=='W'&&a[i+1]=='C') break;
            if(a[i]=='W'&&a[i+1]=='L') 
            {
                i++;
                continue;
            }
            if(a[i]=='W'&&a[i+1]=='W'&&!k) break;
            if(a[i]=='W'&&a[i+1]=='W'&&k)
            {
                k--,i++;
                continue;
            }
            int j=i+1;
            if(a[j]=='L') i++;
            else if(a[j]=='W')
            {
                int l=i+m;
                while(l>i&&a[l]!='L') l--;
                if(l>i) i=l;
                else
                {
                    l=i+m;
                    while(l>i&&a[l]!='W') l--;
                    if(k) k--,i=l;
                    else break;
                }
            }else if(a[j]=='C')
            {
                int l=i+m;
                while(l>i&&a[l]!='L') l--;
                if(l>i) i=l;
                else
                {
                    l=i+m;
                    while(l>i&&a[l]!='W') l--;
                    if(l>i&&k) k--,i=l;
                    else break;
                }
            }
        }
        if(i>=n+1) cout<<"YES"<<'\n';
        else cout<<"NO"<<'\n';
    }
    return 0;
}
暴力做法但是只能过80%多
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
char a[N];
int h[N],e[N],ne[N],idx;
int t,n,m,k,flag;
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa,int w)
{
    if(u==n+1) flag=1;
    if(flag) return;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(j==fa) continue;
        if(a[j]=='W'&&w) dfs(j,u,w-1); 
        else if(a[j]=='L') dfs(j,u,w);
    }
}
int main(void)
{
    std::ios::sync_with_stdio(false);
    cout.tie(0);
    cin.tie(0);
    cin>>t;
    while(t--)
    {
        cin>>n>>m>>k;
        idx=0;
        flag=0;
        a[0]='L',a[n+1]='L';
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=0;i<=n+1;i++) h[i]=-1;
        for(int i=0;i<=n+1;i++)
            for(int j=1;j<=m;j++)
            {
                if(a[i]=='W'&&j!=1) break;
                if(a[i]=='C') continue;
                int l=i+j;
                if(l>n+1) break;
                add(i,l);

            }
        dfs(0,-1,k);
        if(flag) cout<<"YES"<<'\n';
        else cout<<"NO"<<'\n';
    }
    return 0;
}

能量饮料

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,a[N],ans;
int main(void)
{
    cin>>n>>m;
    int ans=0;
    for(int i=1;i<=n;i++) cin>>a[i],ans+=a[i];
    int temp=0;
    while(m--)
    {
        int x,v; cin>>x>>v;
        temp=max(temp,a[x]-v);
    }
    cout<<ans-temp;
    return 0;
}

三消bingo

image.png

#include<bits/stdc++.h>
using namespace std;
string a;
int n;
string solve(string a)
{
    string b;
    for(int i=0;i<a.size();i++)
    {
        int j=i;
        while(j+1<a.size()&&a[j+1]==a[i]) j++;
        if(j-i+1>=3) i=j;
        else b+=a[i];
    }
    return b;
}
int main(void)
{
    cin>>n>>a;
    for(int i=1;i<=1000;i++)
    {
        a=solve(a);
    }
    cout<<a<<endl;
    return 0;
}

你方不方

image.png

image.png

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n; cin>>n;
        puts("YES");
    }
    return 0;
}

除三操作

image.png

image.png

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL cnt[50];
int main(void)
{
    int t; scanf("%d",&t);
    for(int i=0;i<=20;i++) cnt[i]=pow(3,i);
    for(int i=0;i<t;i++)
    {
        int l,r; scanf("%d%d",&l,&r);
        long long int ans=0;
        for(int i=1;i<=20;i++)
        {
            LL l1=cnt[i-1],r1=cnt[i]-1;
            if(l>=l1&&l<=r1&&r>=r1) ans+=(r1-l+1)*i,l=r1+1;
            else if(l>=l1&&r<=r1) ans+=(r-l+1)*i;
        }
        cout<<ans<<endl;
    }
    return 0;
}