码迷,mamicode.com
首页 > 其他好文 > 详细

PTA一些题目

时间:2020-11-01 09:39:49      阅读:16      评论:0      收藏:0      [点我收藏+]

标签:pre   else   首字母   银行排队   热点   div   匹配   false   ons   

1.树的同构

思路:因为他是只交换左右子节点,就可以发现同构的树的父亲节点是相同的,所以你只要记住一个结点的父亲节点是什么,判断两棵树上相同点的父亲节点是否相同,就可以判断是否同构。

最后判断下为只有一个结节点的特殊情况。

技术图片
/*
n==1的情况是不符合的
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
int n,m;
int fa1[maxn],fa2[maxn];
struct node
{
    string s1,s2,s3;
}e1[maxn],e2[maxn];
int main()
{
    //ios::sync_with_stdio(false);
    scanf("%d",&n);
    for(int i=0;i<n;++i)
    {
        cin>>e1[i].s1>>e1[i].s2>>e1[i].s3;
    }
    scanf("%d",&m);
    for(int i=0;i<m;++i)
    {
        cin>>e2[i].s1>>e2[i].s2>>e2[i].s3;
    }
    for(int i=1;i<=n;++i) fa1[i]=i;
    for(int j=1;j<=m;++j) fa2[j]=j;
    for(int i=0;i<n;++i)
    {
        int num=e1[i].s1[0]-A+1;
        if(e1[i].s2!="-")
        {
            int cnt=e1[i].s2[0]-0;
            fa1[e1[cnt].s1[0]-A+1]=num;
        }
        if(e1[i].s3!="-")
        {
            int cnt=e1[i].s3[0]-0;
            fa1[e1[cnt].s1[0]-A+1]=num;
        }
    }
    for(int i=0;i<m;++i)
    {
        int num=e2[i].s1[0]-A+1;
        if(e2[i].s2!="-")
        {
            int cnt=e2[i].s2[0]-0;
            fa2[e2[cnt].s1[0]-A+1]=num;
        }
        if(e2[i].s3!="-")
        {
            int cnt=e2[i].s3[0]-0;
            fa2[e2[cnt].s1[0]-A+1]=num;
        }
    }
    int flag=0;
    if(n!=m) flag=1;
    //if(n==1) flag=1;
    for(int i=1;i<=n;++i)
    {
        if(fa1[i]!=fa2[i])
        {
            flag=1;
            break;
        }
    }
    if(flag) cout<<"No\n";
    else cout<<"Yes\n";
    return 0;
}
View Code


2.新浪微博热门话题

思路:这个题目有点恶心的,给你你需要去掉前导和最后的空格,然后每个之间只能有一个空格,首字母大写,其余的字母都是小,同一句话里面相同的热点只算一次,就可以了。

技术图片
/*
测试样例1模拟一遍就能过
样例二就是没有更多的情况
样例三就是空格
样例四就是首字母大小写以及去掉一些其他的
按照题目意思的一步步模拟就行了

 */
#include<bits/stdc++.h>
using  namespace std;
const int maxn=1e5+50;
int t,vis[maxn];
map<string,int>mp;
string s;
struct data
{
    string s;
    int cnt=0;
    bool friend operator<(const data& a,const data &b)
    {
        if(a.cnt==b.cnt) return a.s<b.s;
        return a.cnt>b.cnt;
    }
}e[maxn];
int main()
{
    scanf("%d",&t);
    getchar();
    int num=1;
    while(t--)
    {
        getline(cin,s);
        for(int i=0;i<num;++i) vis[i]=0;
        //memset(vis,0,sizeof vis);
        int flag=0;
        int st,end;
        for(int i=0;i<s.size();++i)
        {
            if(s[i]==#)
            {
                if(!flag) flag=1,st=i+1;
                else
                {
                   end=i-1;
                   for(int i=end;i>=st;--i)
                   {
                       if((s[i]>=a&&s[i]<=z)||(s[i]>=A&&s[i]<=Z)||s[i]>=0&&s[i]<=9)
                       {
                           end=i;
                           break;
                       }
                   }
                   for(int i=st;i<=end;++i)
                   {
                        if((s[i]>=a&&s[i]<=z)||(s[i]>=A&&s[i]<=Z)||s[i]>=0&&s[i]<=9)
                       {
                           st=i;
                           break;
                       }
                   }
                   string ss="";
                    int nn=0;
                    int ff=-1;
                   for(int i=st;i<=end;++i)
                    {
                        if((s[i]>=a&&s[i]<=z)||(s[i]>=A&&s[i]<=Z))
                        {
                            if(nn==0&&(s[i]>=a&&s[i]<=z))
                            {
                                ss+=s[i]-a+A;
                            }else if(nn==1&&(s[i]>=A&&s[i]<=Z))
                            {
                                ss+=s[i]-A+a;
                            }else
                            {
                                ss+=s[i];
                            }
                            nn=1;
                            ff=0;
                        }
                        else if(s[i]>=0&&s[i]<=9) ss+=s[i],ff=0;
                        else if(!ff)
                        {
                            //if(i!=st&&i!=end&&s[i-1]!=‘ ‘) ss+=s[i];
                            ss+= ;
                            ff=1;
                        }
                    }
                    flag=0;
                    if(ss.size()==0) continue;
                    if(!mp[ss])
                    {
                        mp[ss]=num;
                        e[num].s=ss;
                        e[num].cnt=1;
                        num++;
                    }else
                    {
                        if(!vis[mp[ss]])
                        {
                            e[mp[ss]].cnt++;
                        }
                    }
                    vis[mp[ss]]=1;
                }
            }
        }
    }
    sort(e+1,e+num+1);
    // if(num==0)
    // {
    //     cout<<endl;
    //     cout<<0<<endl;
    //     printf("And 0 more ...\n");
    // }
    //else 
    //{
        // for(int i=0;i<num;++i)
        // {
        //     cout<<e[i].cnt<<" "<<e[i].s<<endl;
        // }
        cout<<e[1].s<<endl;
        cout<<e[1].cnt<<endl;
        int sum=0;
        for(int i=2;i<=num;++i)
        {
            if(e[i].cnt==e[1].cnt) sum++;
            else break;
        }
        if(sum) printf("And %d more ...\n",sum);
    //}
    return 0;
}
View Code

 

3.银行排队问题之单窗口“夹塞”版

思路:模拟题,就按照他的题去模拟,但是需要注意的地方

1.你如果那个人没有插队,是按照顺序来的,如果他到达的时间比现在的时间是晚的那么是要加上中间的时间的

2.如果你是插队的,那么如果你的到达时间是晚于现在的时间,那么就是不能插队的。

因为数据比较水吧,你找到下一个点,就直接for一遍就可以了。

技术图片
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
typedef long long ll;
int n,m,vis[maxn];
map<string,int>mp,cus;
struct {
    string s;
    int arr,op;
}e[maxn];
bool cmp(string a,string  b)
{
    return cus[a]<cus[b];
}
vector<string>ans,v[maxn];
int main()
{
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    cin>>n>>m;  
    for(int i=1;i<=m;++i)
    {
        int l;
        cin>>l;
        while(l--)
        {
            string name;
            cin>>name;
            mp[name]=i;
            v[i].push_back(name);
        }
    }
    for(int i=1;i<=n;++i)
    {
        cin>>e[i].s>>e[i].arr>>e[i].op;       
        cus[e[i].s]=i;
        if(e[i].op>60) e[i].op=60;
    }
    ll tmp=0,sum=0;
    for(int i=1;i<=n;++i)
    {
        if(!vis[i])
        {
            if(e[i].arr>tmp) tmp=e[i].arr;
            sum+=tmp-e[i].arr;
            tmp+=e[i].op;
            ans.push_back(e[i].s);
            vis[i]=1;
            // if(mp.find(e[i].s)!=mp.end())
            // {
            //     sort(v[i].begin(),v[i].end(),cmp);
            //     for(auto x:v[i])
            //     {
            //         int id=cus[x];
            //         if(e[id].arr>tmp) break;
            //         else if(vis[id]) continue;
            //         else
            //         {
            //             sum+=tmp-e[id].arr;
            //             tmp+=e[id].op;
            //             ans.push_back(x);
            //             vis[id]=1;
            //         }
            //     }
            // }    
           if(mp.find(e[i].s)!=mp.end())
            {
                for(int j=i+1;j<=n;++j)
                {
                    if(e[j].arr>tmp) break;
                    if(!vis[j]&&mp[e[i].s]==mp[e[j].s])
                    {
                        if(e[j].arr<=tmp)
                        {
                            sum+=tmp-e[j].arr;
                            if(e[j].op>60) e[j].op=60;
                            tmp+=e[j].op;
                            vis[j]=1;
                            ans.push_back(e[j].s);
                        }
                    }
                }
            }
        }
    }
    for(auto x:ans)
    {
        cout<<x<<endl;
    }
     //cout<<sum<<endl;
    printf("%.1lf\n",1.0*sum/n);
    return 0;

}
View Code

 

4.Yet Another Bracket Sequence

题意:给你个string,反转其中一个,看是否能够完全匹配

思路:直接模拟好像可以过一个,然后这道题可以用线段树,"("看成1,”)”看成-1,那么你去维护一个sum数组,当他整个区间的和为0是就是可以的,然后还要考考虑 ,如果“)”在“(“前面的情况

,维护一个minn数组,就可以了

技术图片
// #include<bits/stdc++.h>
// using namespace std;
// const int maxn=1e5+50;
// char s[maxn];
// int n,m;
// int main()
// {
//     ios::sync_with_stdio(false);
//     cin.tie(0)
//     cin>>n>>m;
//     cin>>s+1;
//     int len=strlen(s+1);
//     while(m--)
//     {
//         int x;
//         cin>>x;
//         if(n%2==1)
//         {
//             cout<<"No\n";

//         }
//         else
//         {
//             if(s[x]==‘(‘) s[x]=‘)‘;
//             else s[x]=‘(‘;
//             int  sum=0;
//             int flag=0;
//             for(int i=1;i<=len;++i)
//             {
//                 if(s[i]==‘(‘) sum++;
//                 else sum--;
//                 if(sum<0)
//                 {
//                     flag=1;
//                     break;
//                 }
//             }
//             if(sum!=0) flag=1;
//             if(flag) cout<<"No\n";
//             else cout<<"Yes\n";
//         }
//     }
//     return 0;
// }
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
char s[maxn];
int sum[maxn<<2],minn[maxn<<2];
void up(int rt,int l,int r,int pos,int x)
{
    if(l==r&&l==pos)
    {
        sum[rt]=x;
        return ;
    }
    int mid=(l+r)>>1;
    if(pos<=mid) up(rt<<1,l,mid,pos,x);
    else up(rt<<1|1,mid+1,r,pos,x);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    minn[rt]=min(minn[rt<<1],sum[rt<<1]+minn[rt<<1|1]);
}
int n,m;

int main()
{
    scanf("%d%d",&n,&m);
    cin>>s+1;
    memset(sum,0,sizeof sum);
    memset(minn,0,sizeof minn);
    for(int i=1;i<=n;++i)
    {
        if(s[i]==() up(1,1,n,i,1);
        else up(1,1,n,i,-1);
    }
    while(m--)
    {
        int x;
        scanf("%d",&x);
        if(s[x]==()
        {
            s[x]=);
            up(1,1,n,x,-1);
        }else
        {
            s[x]=(;
            up(1,1,n,x,1);
        }
        if(sum[1]==0&&minn[1]==0)
        {
            cout<<"Yes\n";
        }else cout<<"No\n";
    }
    return 0;
}
View Code

 

5.愤怒的牛

思路:二分答案。(二分有点弱,要加强一下)

技术图片
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
int n,m;
int a[maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;++i) cin>>a[i];
    sort(a+1,a+n+1);
    int l=a[1],r=a[n];
    cout<<a[1]<<" "<<a[n]<<endl;
    while(l<r)
    {
        int mid=(l+r)>>1;
        int last=1,cnt=1    ;
        for(int i=2;i<=n;++i)
        {   
            if(a[i]-a[last]>=mid) cnt++,last=i;
        }
        if(cnt>=m) l=mid+1;
        else r=mid-1;
    }
    cout<<l<<endl;
    return 0;
}
View Code

 

6. 二叉搜索树的插入序列

 

PTA一些题目

标签:pre   else   首字母   银行排队   热点   div   匹配   false   ons   

原文地址:https://www.cnblogs.com/passawayy/p/13905149.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!