桂林电子科技大学第三届ACM程序设计竞赛 部分题解

本文精选了算法竞赛中常见的代码片段,包括字符串处理、优先队列应用、动态规划、图论等核心算法,通过实例展示了如何高效解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传送门

B

直接map就行了

#include<bits/stdc++.h>
using namespace std;
map<string ,int>mp,mpp;
int main() {
    int n,m;
    //scanf("%d%d",&n,&m);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        string s;
        cin>>s;
        mp[s]++;
    }
    int ans=0;
    map<string ,int >::iterator iter;
    for(iter=mp.begin();iter!=mp.end();iter++)
    {
        string ss=iter->first;
        map<char,int>mp1;
        string s1="";
        for(int i=0;i<ss.size();i++)
        {
            if(mp1[ss[i]]==0)
            s1+=ss[i],mp1[ss[i]]++;
            else
            continue;
        }
        if(mpp[s1]==0)
        {
            ans++;
            mpp[s1]++;
        }
    }
    cout<<ans<<endl;
}

C

首先将ai 按照从大到小的顺序排列好这样就可以每次放入的就是 数组a的最小值 然后再定义一个优先队列 每次弹出的是最小值 然后循环跑一边就可以了

#include<bits/stdc++.h>
using namespace std;
struct node{
    int a,b;
}r[100010];
int n,k;
bool cmp(node a,node b){
    return a.a > b.a;
}
struct cmp1{
    bool operator () (int a,int b)
    {
        return a>b;
    }
};
int main()
{
    cin>>n>>k;
    priority_queue<int,vector<int>,cmp1>q;
    for(int i=1;i<=n;i++)
    {
        cin>>r[i].a>>r[i].b;
    }
    sort(r+1,r+1+n,cmp);
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        q.push(r[i].b);
        if(q.size()==k)
        {
            ans=max(ans,q.top()+r[i].a);
            q.pop();
        }
    }
    cout<<ans<<endl;
    return 0;
}

E

签到题。。 我写的好像比较麻烦

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int a[1010];
        int n;
        cin>>n;
        int maxx=1,ans=1;
        int flag1=1,flag2=1;
        cin>>a[1];
        for(int i=2;i<=n;i++)
        {
            cin>>a[i];
            if(a[i]>=a[i-1])
            {
                ans++;
                flag2=i;
            }
            else
            {
                if(ans>maxx)
                {
                    flag1=flag2;
                    maxx=ans;
                }
                ans=1;
            }
        }
        if(ans>maxx)
        {
            flag1=flag2;
            maxx=ans;
        }
        cout<<flag1-maxx+1<<" "<<flag1<<endl;
        //cout<<maxx<<endl;
    }
    return 0;
}

F

跑一遍Foldy就可以了

#include<bits/stdc++.h>
using namespace std;
int mp[350][350];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        mp[i][j]=0;
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        mp[x][y]=1;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=n;k++)
            {
                if(mp[j][i]==1&&mp[i][k]==1)
                {
                    mp[j][k]=1;
                }
            }
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            if(mp[j][i]==1&&mp[i][j]==1)
            {
                ans++;
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}

H

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        string s;
        cin>>s;
        s=" "+s;
        string ss="";
        for(int i=1;i<s.size();i++)
        {
            if(i%2)
            {
                ss+=s[i];
            }
        }
        cout<<ss<<endl;
    }
}

I

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int b[110];
        memset(b,0,sizeof(b));
        int a[110];
        int n;
        cin>>n;
        for(int i=2;i<n+2;i++)
        {
            cin>>a[i];
            b[i]=a[i];
        }
        int ans=0;
        for(int i=2;i<n+2;i++)
        {
            b[i]=max(b[i-1],b[i-2]+a[i]);
        }
        cout<<b[n+1]<<endl;
    }
}

J

简单搜索

#include<bits/stdc++.h>
using namespace std;
int mp[100][100];
int mpp[100][100];
int n,m;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,-1,1};
struct node{
    int x,y;
}r,rr;
int bfs(int x,int y)
{
    queue<node>q;
    r.x=x;
    r.y=y;
    q.push(r);
    while(q.size()!=0)
    {
        r=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            rr.x=r.x+dx[i];
            rr.y=r.y+dy[i];
            if(mp[rr.x][rr.y]==1&&rr.x>=1&&rr.x<=n&&rr.y>=1&&rr.y<=m&&mpp[rr.x][rr.y]==0)
            {
                mpp[rr.x][rr.y]=1;
                q.push(rr);
            }
        }
    }
    return 0;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
         
        cin>>n>>m;
        int ans=0;
        memset(mp,0,sizeof(mp));
        memset(mpp,0,sizeof(mpp));
        for(int i=1;i<=n;i++)
        {
            string s;
            cin>>s;
            s=" "+s;
            for(int j=1;j<=m;j++)
            {
                mp[i][j]=s[j]-'0';
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(mp[i][j]==1&&mpp[i][j]==0)
                {
                 
                    mpp[i][j]=1;
                    ans++;
                    bfs(i,j);
                }
            }
        }
        cout<<ans<<endl;
    }
}

 

### 关于电子科技大学第八届ACM趣味程序设计竞赛第二场正式赛的题目解析 目前未找到针对电子科技大学第八届ACM趣味程序设计竞赛第二场正式赛的具体题解文档或官方解析[^1]。然而,可以通过分析常见的ACM竞赛题型以及类似的解题思路来推测可能涉及的内容。 #### 常见ACM竞赛题型及其解决方法 1. **暴力求解与优化** 许多ACM竞赛中的问题可以从暴力求解入手,逐步优化至更高效的算法。例如,《算法竞赛入门经典第二版》第七章提到的从暴力到枚举排列的方法可以帮助理解如何通过生成子集和回溯法解决问题[^2]。 2. **字符串处理与模式匹配** 类似于引用[2]中描述的“猜数字游戏”,需要编写一个程序比较两个四位数并输出特定格式的结果(如`xAyB`)。这类问题通常涉及到字符串操作、条件判断以及循环结构的设计[^3]。 3. **动态规划与状态转移方程** 动态规划是一种常用的技巧,尤其适用于具有重叠子问题特性的场景。比如计算某个位置可达路径总数时需考虑是否存在障碍物影响最终结果,正如引用[5]所展示的例子那样[(3,1)]无法获取金币因为后续移动受限[^4]。 4. **组合数学与计数原理应用** 对于某些统计类问题,则需要用到基本的加法规则或者乘法规则来进行有效数目估算。像引用[3]里关于OJ平台可免费使用的合适难度题目数量定义方式就是基于简单的位运算累加得出结论[^5]。 以下是部分典型代码片段示例: ```python def sum_of_digits(number): """返回整数number各位数字相加之和""" total = 0 while number > 0: total += number % 10 number //= 10 return total # 测试函数sum_of_digits() print(sum_of_digits(233)) # 输出应为8 ``` 上述Python脚本展示了如何快速计算任意正整数各个位上的数值总合,这正是应对类似a_i=a[i]=Σd_j形式需求的有效手段之一。 --- #### 总结 尽管未能直接定位到目标赛事的确切解答资料,但借助已知资源仍能够构建起一套完整的思考框架用于指导实际参赛过程中的策略制定工作。希望以上分享对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值