2020 11 14 天梯赛

7-1 阅览室

思路:对于每一天的借书,用一个map存储书号和时间,当还书时,首先在map中寻找,如果找到了,则说明此书可以被还,用此时的时间-map中存储的时间就是这本书被借走的时间。同时,如果书被归还,要在map中删除该书,以便下一个人借。

启示:比赛的时候WA是因为读错了题,错以为一本书每天只能借一次。这几次打天梯赛退步不少,事后分析许多题本来便能做出来,但因为做的太急了,导致许多细节处理不当。做题时不要贪图快,要先保证正确率,读懂题意!

代码如下:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

vector<vector<int>>v;

int main()

{

    int n,i,j,k;

    map<int,int>m;

    cin>>n;

    while(n--)

    {

        m.clear();

          double num=0;

          int ans=0;

        while(1)

        {

            cin>>i;

            char c;

            cin>>c;

            char y;

            int h,mi;

            cin>>h>>y>>mi;

            int sum=h*60+mi;

            if(c=='S')

            {

                m[i]=sum;

            }

            else if(c=='E')

            {

                if(m.find(i)!=m.end())

                {

                    num+=sum-m[i];

                    m.erase(i);

                    ans++;

                }

                else

                {

                    ;

                }

            }

            if(i==0)

            {

                break;

            }

        }

        cout<<ans<<" ";

        if(ans==0)

        {

            cout<<0<<endl;

        }

        else

        printf("%.0f ",num/ans);

    }

    return 0;

}

7-11 集合相似度

思路:用一个set数组存储每一个集合。在判断时先遍历其中一个集合的每一个元素,如果该元素在另一个集合中出现过,便存入另一个set,最后该set的大小就是nc。

nt可以直接用数学公式计算出来。nt=a.size()+b.size()-nc

启示:这道题也是在没有看题解的情况下做出来了,比赛的时候一直WA最后一个点,原因是写的代码有大量的冗余,而且没有找出求nt的规律。静下心来的话发现每一个题都简单了不少。静心!

代码如下:

#include<bits/stdc++.h>

using namespace std;

#define ll long long

int main()

{

    int n,i,j,k,m,nc,nt;

    set<int>s[55];

    cin>>n;

    for(i=1;i<=n;i++)

    {

        cin>>m;

        while(m--)

        {

            cin>>k;

            s[i].insert(k);

        }

    }

    cin>>k;

    while(k--)

    {

        int a,b;

        cin>>a>>b;

        int common=0;

        set<int>ans;

        set<int>::iterator is;

        for(is=s[a].begin();is!=s[a].end();is++)

        {

            if(s[b].find(*is)!=s[b].end())

            {

                ans.insert(*is);

            }

        }

        nc=ans.size();

        nt=s[a].size()+s[b].size()-nc;

        double degree=(double)nc/nt;

        degree*=100;

        printf("%.2lf% ",degree);

    }

    return 0;

}

7-10 关于堆的判断

思路:根据小顶堆的定义建立模型,然后根据题意判断即可。需要注意输入的数是负数的情况。

启示:首先是之前从来没有接触过小顶堆的概念,比赛的时候无从下手,补题的时候一直WA是因为没有注意到输入的数可能是负数的情况。仔细读题!不要急!静心!

代码如下:

#include<bits/stdc++.h>

using namespace std;

int a[2000];

int num=0;

void add(int x)

{

    a[++num]=x;

    int t=num;

    while(t>1&&(a[t]<a[t/2]))

    {

        int tem=a[t];

        a[t]=a[t/2];

        a[t/2]=tem;

        t/=2;

    }

}

int ffind(int x)

{

    int i,k,ans,j;

    for(i=1;i<num;i++)

    {

        if(a[i]==x)

        {

            return i;

        }

    }

    //return 0;

}

int main()

{

    int n,m,i,j,k;

    cin>>n>>m;

    for(i=0;i<n;i++)

    {

        cin>>k;

        add(k);

    }

  //  cout<<"a[1]="<<a[1]<<endl;

    //cout<<"26="<<ffind(26)<<endl;

    //cout<<"23="<<ffind(23)<<endl;

    while(m--)

    {

        string s;

        int x,y;

        cin>>x;

        cin.ignore();

        getline(cin,s);

        //cout<<s<<endl;

        //cout<<"s[3]="<<s[7]<<endl;

        int len=s.size();

        //cout<<len<<endl;

        //cout<<"slen-1="<<s[len-1]<<endl;

        if(s[len-1]=='t')

        {

            //cout<<1<<" "<<s<<endl;

            if(a[1]==x)

            cout<<"T"<<endl;

            else

            {

                cout<<"F"<<endl;

            }

        }

        else if(s[len-1]=='s')

        {

           // cout<<2<<" "<<s<<endl;

            int start,en;

            start=4;

            for(i=4;i<len-1;i++)

            {

                if(s[i+1]==' ')

                {

                    en=i;

                    break;

                }

            }

            int sum=0;

            int u=1;

            for(i=en;i>=start+1;i--)

            {

                sum+=u*(s[i]-'0');

                u*=10;

            }

            if(s[start]=='-')

            {

                sum*=-1;

            }

            else

            {

                sum+=u*(s[start]-'0');

            }

            y=sum;

            int root1=ffind(x)/2;

            int root2=ffind(y)/2;

            if(root1==root2)

            {

                cout<<"T"<<endl;

            }

            else

            {

                cout<<"F"<<endl;

            }

        }

        else if(s[7]=='p')

        {

           //cout<<3<<" "<<s<<endl;

            //cout<<"x====="<<x<<endl;

            int start=17;

            int en=len-1;

            //cout<<"start="<<s[start]<<endl;

           // cout<<"len-1="<<s[len-1]<<endl;

            int sum=0;

            int u=1;

            for(i=en;i>=start+1;i--)

            {

                sum+=u*(s[i]-'0');

                u*=10;

            }

            if(s[start]=='-')

            {

                sum*=-1;

            }

            else

            {

                sum+=u*(s[start]-'0');

            }

            y=sum;

            int root=ffind(y)/2;

            if(a[root]==x)

            {

                cout<<"T"<<endl;

            }

            else

            {

                cout<<"F"<<endl;

            }

        }

        else if(s[3]=='a')

        {

           // cout<<4<<" "<<s<<endl;

            int start=14;

            int en=len-1;

            int sum=0;

            int u=1;

            for(i=en;i>=start+1;i--)

            {

                sum+=u*(s[i]-'0');

                u*=10;

            }

            if(s[start]=='-')

            {

                sum*=-1;

            }

            else

            {

                sum+=u*(s[start]-'0');

            }

            y=sum;

            int root=ffind(x);

            root/=2;

            if(a[root]==y)

            {

                cout<<"T"<<endl;

            }

            else

            {

                cout<<"F"<<endl;

            }

        }

       // cout<<x<<" "<<y<<endl;

    }

    return 0;

}

原文地址:https://www.cnblogs.com/chengxvzhishen/p/14008222.html