2020/10/3 天梯赛训练

7-10 最长对称子串 (25分)

题意:给你一行字符串(含空格),求这个字符串里面最长的回文串的长度;

我的思路:先从一个位置出发,向两边便利,如果相等那就加二。

这样有个问题,就是如果是偶数个的话,答案就不对了;

正确思路:从头和尾部同时遍历,然后碰到相同的就通过一个函数来判断中间的字符串是不是回文,是的话就判断这个字符串的长度与当前最大值的大小关系。

#include
using namespace std;
bool check(string &s)
{
    for(int i = 0;i < s.length();i++)
    {
        if(s[i]==s[s.length()-1-i])
            continue;
        else return false;
    }
    return true;
}
int main()
{
    string s1,s2;
    getline(cin,s1);
    int len = s1.length();
    int tans = 0;
    int finans = 0;
    for(int i = 0;i < len;i++)
    {
        for(int j = len-1;j>=i;j--)
        {
            s2 = s1.substr(i,j-i+1);
            if(check(s2))
            {
                tans = s2.length();
            }
            if(tans>finans)
            {
                finans = tans;
            }
        }
    }
    cout<<finans<<endl;
}

7-12 分而治之 (25分)
题意:有n个城市,m个桥,然后给你m行数字,表示两个城市之间已经连桥,然后给你一个数字np表示方案数目,然后就是np行,第一个是要摧毁城市的数量,紧接着就是城市,问摧毁这些城市之后,有没有摧毁所有的桥。
思路:用结构体表示城市,用map来表示城市之间的关系,1为连接,0为未连接。然后遍历一遍map如果有存在等于1的那这个方案就不行。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
struct node
{
    int x,y;
}a[maxn];
int b[maxn];
int main()
{
    int n,m;
    cin>>n>>m;
    int i,j;
    for(i = 0;i < m;i++)
    {
        cin>>a[i].x>>a[i].y;
    }
    int k;
    cin>>k;
    while(k--)
    {
        int np;
        cin>>np;
        map<int ,int > mp;
        for(i = 0;i < np;i++)
        {
            cin>>b[i];
            mp[b[i]] = 1;
        }
        int flag = 1;
        for(i = 0;i < m;i++)
        {
            if(mp[a[i].x] != 1&&mp[a[i].y] != 1)
            {
                cout<<"NO\n";
                flag = 0;
                break;
            }

        }
        if(flag)
            cout<<"YES\n";
    }

}

题意:先给一个节点的初始地址,然后给一个数字,表示结点的数量,然后是n行数据分别是地址,数据和下一个结点的地址,然后从两头输出。
思路:暴力结构体,输入之后进行排序,然后输出

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;

struct Node{
    int ad,next,data;
}mes[maxn],ans[maxn];

int main(){
    int f,n,a;
    scanf("%d%d",&f,&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a);
        scanf("%d%d",&mes[a].data,&mes[a].next);
    }
    int r=1;
    while(f!=-1){
        ans[r].ad=f;
        ans[r++].data=mes[f].data;
        f=mes[f].next;
    }
    for(int i=1;i<r;i++){//调整顺序
        if(i%2==1)
            mes[i]=ans[r-1-i/2];
        else
            mes[i]=ans[i/2];
    }
    for(int i=1;i<r-1;i++){//疯狂输出
        printf("%05d %d %05d\n",mes[i].ad,mes[i].data,mes[i+1].ad);
    }
    printf("%05d %d -1\n",mes[r-1].ad,mes[r-1].data);
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务