暑假训练总结第1周第一天

题意:
A(CodeForces - 1272F):两个括号字符串是s、t,制造一个最短的括号字符串并使得s和t是它的字串(s和t可以不连续)。
B(CodeForces - 1272D):最多删除数组中的一个元素,求操作后的最长单调增序列的长度。
C(CodeForces - 1272A):三个数,分别可以加一、减一或者不变。求三者操作后分别两两做差的绝对值之和的最小值。
D(CodeForces - 1272E):长度为n的数列ai,每个位置i可以跳到i-ai或i+ai的位置。要求i和经过任意次跳跃后的位置的奇偶性不同。
E(CodeForces - 1272C):求有限个字符在字符串s中的子串个数。
F(CodeForces - 1272B):在对原串进行删除和重排后,求最长的字符串,使得机器人经过字符串的要求移动后能回到原点。

补题:
A:CodeForces 1272 F. Two Bracket Sequences
dp[i][j][k]表示匹配到s的第i个字符,匹配到t的第j个字符,并且此时(的个数比)多k个的时候的最小合法序列长度,k的上限是200(s和t中最多200个(或者))。

状态转移:

枚举答案合法序列的每一位放置(或者)

放置(,如果s[i]== ‘(’ -> ni=i+1,t[j]==’(’ -> nj=j+1, dp[ni][nj][z+1]=dp[i][j][z]+1

放置),如果s[i]== ‘)’ -> ni=i+1,t[j]==’)’ -> nj=j+1, dp[ni][nj][z-1]=dp[i][j][z]+1

整个过程需要满足0<=z<=200 下界是因为z<0时左括号个数小于右括号个数将无法形成合法序列。每一个步转移需要记录父节点坐标和父节点通过什么字符转移到当前状态,最终状态为dp[s.size()][t.size()][0],从这个状态沿着父节点回退到dp[0][0][0]。
代码:

#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int maxn=210;
const int inf=0x3f3f3f3f;
int dp[maxn][maxn][maxn];
struct node{int x,y,z;char c;}st[maxn][maxn][maxn];
string s,t;
int sz,tz;
int nx,ny,nz;
inline void bfs(){
    sz=s.size(),tz=t.size();
    memset(dp,0x3f,sizeof dp);
    dp[0][0][0]=0;
    queue<node> q;q.push(node{0,0,0});
    while(!q.empty()){
        node tp=q.front();q.pop();
        //'('
        nx=tp.x+(tp.x<sz&&s[tp.x]=='(');
        ny=tp.y+(tp.y<tz&&t[tp.y]=='(');
        nz=tp.z+1;
        if(nz<=200&&dp[nx][ny][nz]==inf){
            dp[nx][ny][nz]=dp[tp.x][tp.y][tp.z]+1;
            q.push(node{nx,ny,nz});
            st[nx][ny][nz]=node{tp.x,tp.y,tp.z,'('};

        }
        
        //)
        nx=tp.x+(tp.x<sz&&s[tp.x]==')');
        ny=tp.y+(tp.y<tz&&t[tp.y]==')');
        nz=tp.z-1;
        if(nz>=0&&dp[nx][ny][nz]==inf){
            dp[nx][ny][nz]=dp[tp.x][tp.y][tp.z]+1;
            q.push(node{nx,ny,nz});
            st[nx][ny][nz]=node{tp.x,tp.y,tp.z,')'};
        }
    }
}

int main(){
    cin>>s>>t;
    bfs();

    string res="";
    int x=sz,y=tz,z=0;

    int px,py,pz;
    while(x||y||z){
        res+=st[x][y][z].c;
        px=st[x][y][z].x;
        py=st[x][y][z].y;
        pz=st[x][y][z].z;
        x=px,y=py,z=pz;
    }

    sz=res.size();
    for(int i=sz-1;i>=0;--i)cout<<res[i];
    cout<<endl;
    return 0;
}

B:CodeForces 1272D Yet Remove One Element(AC)(暴力转dp)
思路:一开始想着三重循环,i表示删除的位置,j表示起始位置,k表示从j开始找递增子列。考虑到超时的可能性,在第一次错了之后,还是决定变换整体思路,现在想想,可能是边界的问题。之后想到用两个dp数组来记录第i个的递增个数和记录最大情况。但提交的时候应该是2个dp数组赋初始值的是时候有点差异(一个是先在外面赋值1,另一个是在里面判断在赋值),test5过不去,有点懵…
代码:

#include <iostream>
using namespace std;
int x[200010],y[200010],a[200010];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    x[1]=1;
    for(int i=2;i<n;i++)
    {
        if(a[i]>a[i-1]) x[i]=x[i-1]+1;
        else
            x[i]=1;
    }
    y[n]=1;
    for(int i=n-1;i>1;i--)
    {
        if(a[i+1]>a[i]) y[i]=y[i+1]+1;
        else
            y[i]=1;
    }
    int ans=1;
    if(a[1]<a[2]) ans=x[1]+y[2];
    for(int i=3;i<=n;i++)
    {
        if(a[i]>a[i-1]) ans=max(ans,x[i-1]+y[i]);
        if(a[i]>a[i-2]) ans=max(ans,x[i-2]+y[i]);
    }
    cout<<ans<<endl;
	return 0;
}

C:CodeForces - 1272A Three Friends(AC)(暴力)
思路:一开始就想用三个数的平均数的上取整来比较判断,没过。然后就三重循环暴力求了(ans最大值的取值一开始取小了,模拟的时候贪了,没模拟到测试里的最大值,导致没看出来)。
代码:

`#include<bits/stdc++.h>
#define MAX 3000000010
using namespace std;
int q,a,b,c;
long long ans,sum;
int main ()
{
    cin>>q;
    while(q--)
    {
        ans=2000000000;
        cin>>a>>b>>c;
        a=a-2;
        b=b-2;
        c=c-2;
        for(int i=0; i<3; i++)
        {
            a++;
            for(int j=0; j<3; j++)
            {
                b++;
                for(int k=0; k<3; k++)
                {
                c++;
                sum=abs(a-b)+abs(a-c)+abs(b-c);
                ans=min(sum,ans);
                }
                c=c-3;
            }
            b=b-3;
        }
        cout<<ans<<endl;
    }
}`

D:CodeForces - 1272E Nearest Opposite Parity
思路:反向建边,直接将所有的奇性点入队,然后bfs,依次遍历到的偶性点 的 步数,即为结果。再同样跑一遍偶性点
代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100;
const int inf=0x3f3f3f3f;
int arr[maxn];
int ans[maxn];
vector<int>edge[maxn];
int n;
void solve(int flag)
{
    int temp[maxn];
    bool vis[maxn];
    memset(temp,0,sizeof temp);
    memset(vis,false,sizeof vis);
    queue<int>q;
    for(int i=1;i<=n;++i)
    {
        if((arr[i]&1)==flag)
        {
            q.push(i);
            //cout<<"??"<<i<<endl;
            vis[i]=true;
        }
    }
    while(!q.empty())
    {
        int f=q.front();
        q.pop();
        //cout<<"pls"<<f<<endl;
        for(int i=0;i<edge[f].size();++i)
        {
            if(!vis[edge[f][i]])
            {
 
                q.push(edge[f][i]);
                vis[edge[f][i]]=true;
                temp[edge[f][i]]=temp[f]+1;
            }
        }
    }
    for(int i=1;i<=n;++i)
    {
        if(vis[i]&&!((arr[i]&1)==flag))
            ans[i]=temp[i];
    }
}
int main()
{
    cin>>n;
    for(int i=1; i<=n; ++i)
        cin>>arr[i];
    for(int i=1;i<=n;++i)
    {
        if(i-arr[i]>=1)
        {
            edge[i-arr[i]].push_back(i);
        }
        if(i+arr[i]<=n)
        {
            edge[i+arr[i]].push_back(i);
        }
    }
    solve(1);
    solve(0);
    for(int i=1;i<=n;++i)
    {
        if(ans[i])
            cout<<ans[i]<<" ";
        else
            cout<<-1<<" ";
    }
    return 0;
}

E:CodeForces - 1272C Yet Another Broken Keyboard
思路:先找一个符合条件的最长连续字串,再用等比数列求和公式,注意数据类型用long long。
代码:

#include<bits/stdc++.h>
using namespace std;
long long n,k,sum,f,ans,b[27]={0};
string s;
char a[27],x;
int main ()
{
    cin>>n>>k;
    cin>>s;
    sum=0;
    ans=0;
    for(int i=0; i<k; i++)
    {
        cin>>a[i];
        b[a[i]-'a'+1]=1;
    }
    for(int i=0; i<n; i++)
    {

            if(b[s[i]-'a'+1])
                sum++;
            else{
                ans=ans+sum*(sum+1)/2;
                sum=0;
            }

    }
    ans=ans+sum*(sum+1)/2;
    cout<<ans<<endl;

}

F:CodeForces - 1272B Snow Walking Robot
思路:想要回原点,那L和R数量需要相等,且U和D数量需要相等。分两种情况考虑:如果竖直方向或水平方向不可以移动,那只能移一次水平或者竖直方向;否则移个正方形即可
代码:

#include<bits/stdc++.h>
#include<string>
using namespace std;
int main ()
{
    int q,le;
    cin>>q;
    while(q--)
    {
        string s;
        cin>>s;
        int u=0,d=0,l=0,r=0;
        le=s.length();
        //cout<<le<<endl;
        for(int i=0; i<le; i++)
        {
            if(s[i]=='U')
                u++;
            else if(s[i]=='D')d++;
            else if(s[i]=='L')l++;
            else if(s[i]=='R')r++;
        }
        int x=min(l,r),y=min(u,d);
        if(x==0)
        {
            if(y==0)
                cout<<0<<endl;
            else
                cout<<2<<endl<<"UD"<<endl;
        }
        else
        if(y==0){
            if(x==0)
                cout<<0<<endl;
            else
               cout<<2<<'\n'<<"LR\n";
        }
        else
        {
            cout<<(x+y)*2<<endl;
            string ans="";
            for(int i=0;i<x;i++)
                ans=ans+"L";
            for(int i=0;i<y;i++)
                ans=ans+"U";
            for(int i=0;i<x;i++)
                ans=ans+"R";
            for(int i=0;i<y;i++)
                ans=ans+"D";
                cout<<ans<<endl;
        }
    }
}

感想:在早上的比赛后,过了BC两题,尝试过一题。尝试的E题感觉把自己骗了,只考虑了暴力的算法在tel之后没有继续去考虑优化的方法,转而去做别的题,有点可惜,毕竟事后发现挺简单的。C题主要是细节的问题没出来好,小错误导致白白wa了两次。没有全部看一遍的原因应该还是想慢了,在BC题的优化还是花太多时间了,而且现在看了AD的题解后,确实感觉自己的能力有点不足,还要继续补充专业的一些知识点。

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值