天梯赛5

7-6 帅到没朋友
题解:
这个题大体就是判断一下有哪几个人是不在朋友圈的
但是之前比赛的时候用的方法一直超时
用的set判断,基本就是嵌套两个for循环感觉也不是很多,但就是超时

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    set<string> s;
    while(n--)
    {
        int k;
        cin>>k;
        if(k>1)
        {
            string t;
            while(k--)
            {
                cin>>t;
                s.insert(t);
            }
        }
        else
        {
            while(k--)
            {
                string t;
                cin>>t;
            }
        }
    }
    int m;
    vector<string> v;
    cin>>m;
    while(m--)
    {
        string t;
        cin>>t;
        int falg=0;
        for(auto it=s.begin();it!=s.end();it++)
        {
            if(t==*it)
            {
                falg=1;
                break;
            }
        }
        if(falg==0)
        {
            v.push_back(t);
        }
    }
    vector<string> v1;
    for(int j=0;j<v.size();j++)
    {
        int falg1=1;
            for(int i=0;i<v1.size();i++)
            {
                if(v[j]==v1[i])
                {
                    falg1=0;
                    break;
                }
            }
            if(falg1==1)
            {
                v1.push_back(v[j]);
            }
    }
    if(v1.size()==0)
    {
        cout<<"No one is handsome"<<endl;
    }
    if(v1.size()>0)
    {
        cout<<v1[0];
        for(int i=1;i<v1.size();i++)
        {
            cout<<" "<<v1[i];
        }
        cout<<endl;
    }
}

后来看队里大佬的代码改用普通的数组,就不超时了,按照大佬的思路打的
也相当于用了set,不会存在两个重复的情况,超级巧妙

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int a[100000];
int main()
{
    int n,m,b,k,i,j;
    cin>>n;
    for(i=0; i<n; i++)
    {
        cin>>m;
        for(j=0; j<m; j++)
        {
            cin>>b;
            if(m!=1)
            {
                a[b]=1;
            }
        }
    }
    cin>>m;
    int flag=0;
    for(i=0; i<m; i++)
    {
        cin>>b;
        if(flag==0)
        {
            if(a[b]!=1)
            {
                printf("%05d",b);
                a[b]=1;
                flag=1;
            }
        }

        else
        {
            if(a[b]!=1)
            {
                printf(" %05d",b);
                a[b]=1;
            }

        }
    }
    if(flag==0)
    {
        cout<<"No one is handsome"<<endl;
    }
    return 0;
}

7-10 悄悄关注
题解:这个题其实挺简单的,但是一如既往地超时,一遇到string用set的情况我就超时
超时代码

#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
struct people
{
    string name;
    int num;
};
people p[10000];
int main()
{
    speed_up;
    int n;
    cin>>n;
    vector<string> t;//关注
    for(int i=0;i<n;i++)
    {
        string t1;
        cin>>t1;
        t.push_back(t1);
    }
    int m;
    cin>>m;
    double sum=0;
    for(int i=0;i<m;i++)
    {
        cin>>p[i].name;
        cin>>p[i].num;
        sum=sum+p[i].num;
    }
    sum=sum/m;
    vector<string> t2;
    for(int i=0;i<m;i++)
    {
        if(p[i].num>sum)
        {
            t2.push_back(p[i].name);
        }
    }
    sort(t2.begin(),t2.end());
    int sum1=0;
    for(int i=0;i<t2.size();i++)
    {
        int k=1;
        for(int j=0;j<t.size();j++)
        {
            if(t2[i]==t[j])
            {
                k=0;
                break;
            }
        }
        if(k==1)
        {
            cout<<t2[i]<<endl;
            sum1=1;
        }
    }
    if(sum1==0)
    {
        cout<<"Bing Mei You"<<endl;
    }
}

后来看队里大佬写的代码用的map更简单,照着他们的思路打的,以后遇到string 的题就少用set多用普通数组和map
不用map的话可能就要定义一个结构体来存放,用map就可以直接存放

#include<bits/stdc++.h>
#define ll long long
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

int main()
{
    speed_up;
    int n;
    cin>>n;
    map<string,int>mp;
    for(int i=0; i<n; i++)
    {
        string a;
        cin>>a;
        mp[a]++;
    }
    int m;
    cin>>m;
    string s[m];
    int k[m];
    double sum=0;
    for(int i=0; i<m; i++)
    {
        string a;
        cin>>a>>k[i];
        sum+=k[i];
        s[i]=a;
        if(mp[a]!=1)mp[a]=k[i];
    }
    sum/=m;
    int f=0;
    for (auto it = mp.begin(); it != mp.end(); it++)
    {
        if(it->second>sum)
        {
            cout<<it->first<<endl;
            f=1;
        }
    }
    if(f==0)cout<<"Bing Mei You"<<endl;

}

7-11 彩虹瓶
这个题当时没什么思路时间也不太够了,后期看的大佬的代码
模拟装箱过程,货架看成栈

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int N,M,K,num,start,flag;
    cin >> N >> M >> K;
    for(int i=0;i<K;i++)
    {
        stack<int> st;
        start = 1;flag=1;
        for(int j=0;j<N;j++)
        {
            cin >> num;
            if(num!=start) st.push(num);  
            //如果搬来的这箱小球不是可以装填的颜色,就把箱子先码放在一个临时货架上
            else start++;  
            //如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填
            
            //当一种颜色装填完以后
            while(!st.empty()&&st.top()<=start)
            {  //先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来
                st.pop();
                start++;
            }
            if(st.size()>M) flag=0;
        }
        if(flag&&st.empty()) cout << "YES"<<endl;
        else cout << "NO"<<endl;
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值