2024年西南科技大学新生赛 【题解完成】

69 阅读4分钟
题目难度知识点
A 球?球签到
B 活动签到
C 分赃博弈论
D 三行四列行列式签到
E KAKAZL的时间魔咒模拟
F 加训模拟
G 白日登山望烽火,黄昏饮马傍交河马喝水最短,数学
H Small Orange的后花园★★前缀和,双重累加化简
I 解码签到
J 选歌签到
K 晒卡签到
L aya的字符串签到
M 有顶天变~★★贪心

球?球

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N],t,n,z,s;
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>n>>z>>s;
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) cin>>b[i];
        int cnt1=0,cnt2=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i]>s) cnt1=max(cnt1-2,0);
            if(a[i]<=s) cnt1++;
            if(b[i]>z) cnt2=max(cnt2-2,0);
            if(b[i]<=z) cnt2++;
        }
        if(cnt1>cnt2) puts("zy");
        else if(cnt1==cnt2) puts("none");
        else puts("sdy");
    }
    return 0;
}

活动

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int n; cin>>n;
    if(n>=50) puts("wy");
    else puts("ty");
    return 0;
}

分赃

image.png

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    string s; cin>>s;
    int t=s[s.size()-1]-'0';
    if(t&1) puts("clx");
    else puts("yxy");
    return 0;
}

三行四列行列式

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N][N],b[N][N],n,x,y;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) cin>>a[i][j],b[i][j]=a[i][j];
    cin>>x>>y;
    for(int i=1;i<=n;i++)
        b[x][i]=a[i][y],b[i][y]=a[x][i];
    b[x][y]=ceil((a[x][x]+a[y][y])/2.0);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++) cout<<b[i][j]<<" ";
        puts("");
    }
    return 0;
}

KAKAZL的时间魔咒

#include<bits/stdc++.h>
using namespace std;
void solve(int a,int b)
{
    int cnt=0;
    while(1)
    {
        string s1=to_string(a);
        string s2=to_string(b);
        if(s1.size()==1) s1="0"+s1;
        if(s2.size()==1) s2="0"+s2;
        reverse(s2.begin(),s2.end());
        if(s1==s2)
        {
            reverse(s2.begin(),s2.end());
            cout<<s1<<":"<<s2<<'\n';
            cout<<cnt<<'\n';
            break;
        }
        b++,cnt++;
        if(b==60) a++,b=0;
        if(a==24) a=0;
    }
}
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int a,b;
        scanf("%d:%d",&a,&b);
        solve(a,b);
    }
    return 0;
}

加训

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n,m;
        string a,b;
        cin>>n>>m>>a>>b;
        string ans;
        for(int i=0;i<n;i++)
        {
            int j=i;
            while(j+1<n&&a[j+1]==a[i]) j++;
            i=j;
            ans+=a[i];
        }
        if(ans==b) puts("Yes");
        else puts("No");
    }
    return 0;
}

白日登山望烽火,黄昏饮马傍交河

image.png 最短就是对称点到A的距离。

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        double x,y,xx,yy; cin>>x>>y>>xx>>yy;
        double dyx,dyy,dxx,dxy;
        dyx=-xx,dyy=yy,dxx=xx,dxy=-yy;
        double sumy=(x-dyx)*(x-dyx)+(y-dyy)*(y-dyy);
        double sumx=(x-dxx)*(x-dxx)+(y-dxy)*(y-dxy);
        if(sumx<sumy) puts("x");
        else puts("y");
    }
    return 0;
}

Small Orange的后花园

image.png

image.png

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int mod=998244353;
typedef long long int LL;
LL f[N],s[N],ss[N],t,n;
void init()
{
    f[1]=1,f[2]=1;
    for(int i=3;i<=1e5;i++) f[i]=(f[i-1]+f[i-2])%mod;
    for(int i=1;i<=1e5;i++)
    {
        s[i]=(s[i-1]+f[i])%mod;
        ss[i]=(ss[i-1]+f[i]*f[i]%mod)%mod;
    }
}
void solve(int n)
{
    LL sum=0;
    for(int i=1;i<=n;i++)
    {
        LL sum1=(s[n]-s[i-1]+mod)%mod;
        LL sum2=(ss[n]-ss[i-1]+mod)%mod;
        LL temp1=(n-i+1)*f[i]%mod*f[i]%mod;
        LL temp2=-2*f[i]%mod*sum1%mod;
        sum=(sum+temp1)%mod;
        sum=(sum+temp2+mod)%mod;
        sum=(sum+sum2)%mod;
    }
    cout<<sum<<'\n';
}
int main(void)
{
    cin>>t;
    init();
    while(t--)
    {
        cin>>n;
        solve(n);
    }
    return 0;
}

解码

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n,k; cin>>n>>k;
        string s; cin>>s;
        for(int i=0;i<n;i++)
        {
            if(s[i]>='a')
            {
                char op='a'+(s[i]-'a'-k+26)%26;
                cout<<op;
            }else
            {
                 char op='A'+(s[i]-'A'-k+26)%26;
                cout<<op;
            }
        }
        cout<<'\n';
    }
    return 0;
}

选歌

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],t,n,sum;
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>n>>sum;
        vector<pair<int,int>>ve;
        for(int i=1;i<=n;i++) cin>>a[i],ve.push_back({-a[i],i});
        sort(ve.begin(),ve.end());
        vector<int>ans;
        for(int i=0;i<n;i++)
        {
            sum+=ve[i].first;
            ans.push_back(ve[i].second);
            if(sum<=0) break;
        }
        if(sum<=0)
        {
            puts("YES");
            cout<<ans.size()<<'\n';
            for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
            puts("");
        }else puts("NO");
    }
    return 0;
}

晒卡

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
int a[N],b[N],n,t;
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        map<int,int>mp,mp1;
        for(int i=0;i<n;i++) cin>>a[i],mp[a[i]]++;
        vector<int>ans;
        for(int i=0;i<n;i++)
        {
            cin>>b[i];
            if(mp[b[i]]&&!mp1[b[i]]) ans.push_back(b[i]);
            mp1[b[i]]++;
        }
        sort(ans.begin(),ans.end());
        cout<<ans.size()<<'\n';
        for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
        if(ans.size()) cout<<'\n';
    }
    return 0;
}

aya的字符串

正解是字符串hash,但是由于A 中每种字母只出现了一次。故其实暴力枚举不了几次

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        int n;
        string s;
        cin>>n>>s;
        int st[26]={0};
        int flag=1;
        for(int i=0;i<n;i++)
            if(s[i]>='a'&&s[i]<='z');
            else flag=0;
        if(!flag)
        {
            puts("shameimaru");
            continue;
        }
        flag=0;
        for(int i=0;i<s.size();i++)
        {
            if(st[s[i]-'a']) break;
            st[s[i]-'a']++;
            int len=s.size()-i-1;
            if(len%2==0&&len>=2)
            {
                string s1=s.substr(i+1,len/2);
                string s2=s.substr(i+1+len/2);
                if(s1==s2) flag=1;
            }
            if(flag) break;
        }
        if(flag) puts("aya");
        else puts("shameimaru");
    }
    return 0;
}

有顶天变~

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],t,n;
int main(void)
{
    cin>>t;
    while(t--)
    {
        cin>>n;
        int maxv=0;
        for(int i=1;i<=n;i++) cin>>a[i],maxv=max(maxv,a[i]);
        a[n+1]=maxv;
        long long int sum=0;
        for(int i=2;i<=n+1;i++) 
                if(a[i]>a[i-1]) sum+=a[i]-a[i-1];
        cout<<sum<<'\n';
    }
}