重庆师范大学第一届ACM选拔赛【题解完成】

54 阅读3分钟
题目难度知识点
A 不一样的食物链模拟
B 有趣的求和★★dfs
C 统计患病人数★★dfs
D 皮皮想拜师★★dfs
E 爱玩游戏的Tom01背包
F 天选子★★模拟
G 团日活动贪心
H 标准签到题模拟
I 炎炎消防队★★枚举

image.png

不一样的食物链

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
vector<string>ve;
map<string,int>mp;
int main(void)
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        string a,b; cin>>a>>b;
        mp[b]++;
        ve.push_back(a);
        ve.push_back(b);
    }
    int flag=1;
    for(int i=0;i<ve.size();i++)
        if(mp.count(ve[i])==0) flag=0;
    cout<<flag;
    return 0;
}

有趣的求和

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=50;
int a[N],w[N],n,ans;
vector<string>ve;
void dfs(int index)
{
    if(index==n-1)
    {
        int sum=a[1];
        for(int i=1;i<=n-2;i++)
        {
            if(w[i]) sum+=a[i+1];
            else sum-=a[i+1];
        }
        if(sum==a[n])
        {
            ans++;
            string temp;
            for(int i=1;i<=n-2;i++)
                if(w[i]) temp+="+";
                else temp+="-";
            ve.push_back(temp);
        }
        return;
    }
    for(int i=0;i<=1;i++)
    {
        w[index]=i;
        dfs(index+1);
        w[index]=0;
    }
}
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    dfs(1);
    cout<<ans<<'\n';
    for(int i=0;i<ve.size();i++) cout<<ve[i]<<'\n';
    return 0;
}

统计患病人数

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=1e6*2+10;
int h[N],e[M],ne[M],idx;
int x,n,m,a[N];
int st[N];
vector<int>ans;
void dfs(int u)
{
    st[u]=1;
    ans.push_back(u);
    for(int i=h[u];i!=-1;i=ne[i])
    {
        int j=e[i];
        if(st[j]) continue;
        dfs(j);
    }
}
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int main(void)
{
    cin>>x>>n>>m;
    memset(h,-1,sizeof h);
    while(m--)
    {
        int k; cin>>k;
        for(int i=1;i<=k;i++) cin>>a[i];
        for(int i=1;i<=k;i++)
        {
            for(int j=i+1;j<=k;j++)
            {
                add(a[i],a[j]),add(a[j],a[i]);
            }
        }
    }
    dfs(n);
    cout<<ans.size()<<" ";
    sort(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
    return 0;
}

皮皮想拜师

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=1e6*2+10;
int st[N],n,m;
void bfs()
{
    memset(st,-1,sizeof st);
    st[n]=0;
    queue<int>q; q.push(n);
    while(q.size())
    {
        int u=q.front(); q.pop();
        if(u==m)
        {
            cout<<st[u];
            return;
        }
        if( (st[u*2]==-1) && (u*2)<=1e6 ) 
        {
            st[u*2]=st[u]+1;
            q.push(u*2);
        }
        if( st[u-1]==-1 && (u-1>=1))
        {
            st[u-1]=st[u]+1;
            q.push(u-1);
        }
        if( (st[u+1]==-1) && (u+1<=1e6))
        {
            st[u+1]=st[u]+1;
            q.push(u+1);
        }
    }
}
int main(void)
{
    cin>>m>>n;
    bfs();
    return 0;
}

爱玩游戏的Tom

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=110;
const int M=1e4+10;
typedef long long int LL;
LL f[N][M],v[N],w[N],n,m;
int main(void)
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>v[i]>>w[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            f[i][j]=f[i-1][j];
            if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);
        }
    }
    cout<<f[n][m];
    return 0;
}

天选子

image.png

#include<bits/stdc++.h>
using namespace std;
deque<int>q,q1;
int n,m,flag;
int main(void)
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) q.push_back(i);
    while(q.size()>3)
    {
        deque<int>q1;
        if(!flag)
        {
            while(q.size()>=2)
            {
                int a1=q.front(); q.pop_front();
                int a2=q.front(); q.pop_front();
                q1.push_back(a1);
            }
            if(q.size()) q1.push_back(q.front());
            q=q1;
        }
        else{
            while(q.size()>=3)
            {
                int a1=q.front(); q.pop_front();
                int a2=q.front(); q.pop_front();
                int a3=q.front(); q.pop_front();
                q1.push_back(a1);
                q1.push_back(a2);
             }
             while(q.size()) q1.push_back(q.front()),q.pop_front();
             q=q1;
        }   
        flag=flag^1;
    }
    vector<int>ve;
    int sum=0;
    while(q.size()) ve.push_back(q.front()),q.pop_front();
    for(int i=0;i<ve.size();i++) sum+=ve[i];
    if(sum>m)
    {
        for(int i=0;i<ve.size();i++) cout<<ve[i]<<" ";
    }else
    {
        cout<<abs(sum-m);
    }
    return 0;
}

团日活动

image.png 假如5个男的,肯定54一对32一对

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        long long int sum,n; cin>>sum>>n;
        LL ans=0;
        LL cnt=n/2;
        LL temp=sum-n;
        ans=cnt*n-cnt*(cnt-1);
        if(n%2) temp++;
        ans+=temp/2;
        if(temp%2) ans++;
        cout<<ans<<'\n';
    }
    return 0;
}

标准签到题

image.png

#include<bits/stdc++.h>
using namespace std;
int main(void)
{
    string s; cin>>s;
    int cnt=0;
    for(int i=0;i<s.size();i++)
    {
        string a=s.substr(i,3);
        if(a=="ora")  cnt++;
    }
    if(cnt==0) puts("yare yare daze");
    else cout<<cnt;
    return 0;
}

炎炎消防队

image.png

#include<bits/stdc++.h>
using namespace std;
double t,y;
double check(double x)
{
    double sum=7*x*x*x*x*x*x*x+6*x*x*x*x*x*x+2*x*x*x+8*x*x-y*x;
    return sum;
}
int main(void)
{
    cin>>t;
    while(t--)
    {
        scanf("%lf",&y);
        double ans=1e9;
        for(double i=0.0001;i<=100;i+=0.0001) ans=min(ans,check(i));
        printf("%.4lf\n",ans);
    }
    return 0;
}