• 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;

    }

  • 相关阅读:
    机器学习粗略认识--线性模型
    LDA主题模型困惑度计算
    python-igraph
    pandas 使用技巧
    pandas读取MySql/SqlServer数据
    聚类模型性能评价指标
    各种编码格式
    利用分块传输吊打所有WAF--学习笔记
    Sql 注入----学习笔记2
    Sql 注入----学习笔记
  • 原文地址:https://www.cnblogs.com/chengxvzhishen/p/14008222.html
Copyright © 2020-2023  润新知