2020.11.8-天梯练习赛补题

7-6帅到没朋友

当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。

输入格式:

输入第一行给出一个正整数N≤),是已知朋友圈的个数;随后N行,每行首先给出一个正整数K≤),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M≤),为待查询的人数;随后一行中列出M个待查询的ID,以空格分隔。

注意:没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。虽然有个别自恋狂会自己把自己反复加进朋友圈,但题目保证所有K超过1的朋友圈里都至少有2个不同的人。

输出格式:

按输入的顺序输出那些帅到没朋友的人。ID间用1个空格分隔,行的首尾不得有多余空格。如果没有人太帅,则输出No one is handsome

注意:同一个人可以被查询多次,但只输出一次。

输入样例1:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
8
55555 44444 10000 88888 22222 11111 23333 88888
 

输出样例1:

10000 88888 23333
 

输入样例2:

3
3 11111 22222 55555
2 33333 44444
4 55555 66666 99999 77777
4
55555 44444 22222 11111
 

输出样例2:

No one is handsome
需要注意格式,ID号要为5位,还有没有朋友的人可以是根本没安装“朋友圈”,也可以是只有自己一个人在朋友圈的人。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,b[100000]={0};
    int s[100000]={0};
    int k;
    cin>>n;

    while(n--)
    {

        cin>>k;
        int id;
        //cout<<k<<"**"<<endl;
        if(k==0)cout<<"No one is handsome"<<endl;
        else if(k>1)
        {

            while(k--){
                cin>>id;
                b[id]++;
                //cout<<id<<" ";
            }
        }
        else cin>>id;
        //cout<<n<<"*"<<endl;
    }
            int m;
            cin>>m;
            int w,p=0,l=0;
            for(int i=0;i<m;i++)
            {
                cin>>w;
                if(b[w]==0)
                {
                    l=1;
                    b[w]=2;
                    if(p!=0)printf(" %05d",w);
                    else p++,printf("%05d",w);
                }
            }
            if(l==1)cout<<endl;
            if(l==0)cout<<"No one is handsome"<<endl;
}

7-9 点赞狂魔

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。

输入格式:

输入在第一行给出一个正整数N(≤),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name F1​​FK​​”,其中Name是不超过8个英文小写字母的非空用户名,1,Fi​​(,)是特性标签的编号,我们将所有特性标签从 1 到 1 编号。数字间以空格分隔。

输出格式:

统计每个人点赞的不同标签的数量,找出数量最大的前3名,在一行中顺序输出他们的用户名,其间以1个空格分隔,且行末不得有多余空格。如果有并列,则输出标签出现次数平均值最小的那个,题目保证这样的用户没有并列。若不足3人,则用-补齐缺失,例如mike jenny -就表示只有2人。

输入样例:

5
bob 11 101 102 103 104 105 106 107 108 108 107 107
peter 8 1 2 3 4 3 2 5 1
chris 12 1 2 3 4 5 6 7 8 9 1 2 3
john 10 8 7 6 5 4 3 2 1 7 5
jack 9 6 7 8 9 10 11 12 13 14
 

输出样例:

jack chris john

题解:建立结构体来输入每个人的不同标签的数量及点赞的所有标签数,用set建立数组来求出不同标签的数量,再写一个比较函数,根据题意输出结果

#include<bits/stdc++.h>
using namespace std;
const int maxn=10000001;
struct person
{
    string s;
    int k;//不同标签的数量
    int ch;//点赞总数
}str[1010];
bool cmp(person a,person bt)
{
    if(a.k!=bt.k)return a.k>bt.k;
    else
    {
        return a.ch<bt.ch;

    }
}
int main()
{
    int n;
    cin>>n;
    getchar();
    set<int>s;

    int ct,k;
    for(int i=0;i<n;i++)
    {
        s.clear();
         cin>>str[i].s>>str[i].ch;
         getchar();
         for(int j=0;j<str[i].ch;j++)
         {
             int w;
             cin>>w;
             s.insert(w);
         }
         str[i].k=s.size();

    }
     sort(str,str+n,cmp);
     if(n<3)
     {
         for(int i=0;i<n;i++)
         {
             cout<<str[i].s<<" ";
         }
         for(int j=n;j<3;j++)
         {
             if(j==n)cout<<"-";
             else cout<<" -";
         }
     }
     else
     {
         for(int i=0;i<3;i++)
         {
             if(i==0)cout<<str[i].s;
             else cout<<" "<<str[i].s;
         }
         cout<<endl;
     }
}

 

7-10悄悄关注

新浪微博上有个“悄悄关注”,一个用户悄悄关注的人,不出现在这个用户的关注列表上,但系统会推送其悄悄关注的人发表的微博给该用户。现在我们来做一回网络侦探,根据某人的关注列表和其对其他用户的点赞情况,扒出有可能被其悄悄关注的人。

输入格式:

输入首先在第一行给出某用户的关注列表,格式如下:

人数N 用户1 用户2 …… 用户N
 

其中N是不超过5000的正整数,每个用户ii=1, ..., N)是被其关注的用户的ID,是长度为4位的由数字和英文字母组成的字符串,各项间以空格分隔。

之后给出该用户点赞的信息:首先给出一个不超过10000的正整数M,随后M行,每行给出一个被其点赞的用户ID和对该用户的点赞次数(不超过1000),以空格分隔。注意:用户ID是一个用户的唯一身份标识。题目保证在关注列表中没有重复用户,在点赞信息中也没有重复用户。

输出格式:

我们认为被该用户点赞次数大于其点赞平均数、且不在其关注列表上的人,很可能是其悄悄关注的人。根据这个假设,请你按用户ID字母序的升序输出可能是其悄悄关注的人,每行1个ID。如果其实并没有这样的人,则输出“Bing Mei You”。

输入样例1:

10 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao
8
Magi 50
Pota 30
LLao 3
Ammy 48
Dave 15
GAO3 31
Zoro 1
Cath 60
 

输出样例1:

Ammy
Cath
Pota
 

输入样例2:

11 GAO3 Magi Zha1 Sen1 Quan FaMK LSum Eins FatM LLao Pota
7
Magi 50
Pota 30
LLao 48
Ammy 3
Dave 15
GAO3 31
Zoro 29
 

输出样例2:

Bing Mei You

题解:用set定义字符串数组s,将关注的用户插入s中,输入m行信息时用set检验是否存在该人名,若不存在则将名称及点赞数保存到结构体定义的数组str中,让后将str排序,根据是否点赞数大于平均数输出名称即可

#include<bits/stdc++.h>
using namespace std;
struct person
{
    string s;
    int n;
}str[10000];
bool cmp(person a,person b)
{
    return a.s<b.s;
}
int main()
{
    int n;
    string w,b;
    set<string>s;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>w;
        s.insert(w);
    }
    int m;
    cin>>m;
    int sum=0;
    double num=0;
    int k=0,ct;
    for(int i=0;i<m;i++)
    {
        cin>>b>>ct;
        if(s.find(b)==s.end())
        {
            str[k].s=b;
            str[k].n=ct;
            k++;
        }
        sum+=ct;
    }
    num=sum*1.0/m;
    sort(str,str+k,cmp);
    int p=0;
    for(int i=0;i<k;i++)
    {
        if(str[i].n>num)
        {
            p=1;
            cout<<str[i].s<<endl;
        }
    }
    if(p==0)cout<<"Bing Mei You"<<endl;
}

 

7-11彩虹瓶

 

彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。

假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N)。现在工厂里有每种颜色的小球各一箱,工人需要一箱一箱地将小球从工厂里搬到装填场地。如果搬来的这箱小球正好是可以装填的颜色,就直接拆箱装填;如果不是,就把箱子先码放在一个临时货架上,码放的方法就是一箱一箱堆上去。当一种颜色装填完以后,先看看货架顶端的一箱是不是下一个要装填的颜色,如果是就取下来装填,否则去工厂里再搬一箱过来。

如果工厂里发货的顺序比较好,工人就可以顺利地完成装填。例如要按顺序装填 7 种颜色,工厂按照 7、6、1、3、2、5、4 这个顺序发货,则工人先拿到 7、6 两种不能装填的颜色,将其按照 7 在下、6 在上的顺序堆在货架上;拿到 1 时可以直接装填;拿到 3 时又得临时码放在 6 号颜色箱上;拿到 2 时可以直接装填;随后从货架顶取下 3 进行装填;然后拿到 5,临时码放到 6 上面;最后取了 4 号颜色直接装填;剩下的工作就是顺序从货架上取下 5、6、7 依次装填。

但如果工厂按照 3、1、5、4、2、6、7 这个顺序发货,工人就必须要愤怒地折腾货架了,因为装填完 2 号颜色以后,不把货架上的多个箱子搬下来就拿不到 3 号箱,就不可能顺利完成任务。

另外,货架的容量有限,如果要堆积的货物超过容量,工人也没办法顺利完成任务。例如工厂按照 7、6、5、4、3、2、1 这个顺序发货,如果货架够高,能码放 6 只箱子,那还是可以顺利完工的;但如果货架只能码放 5 只箱子,工人就又要愤怒了……

本题就请你判断一下,工厂的发货顺序能否让工人顺利完成任务。

输入格式:

输入首先在第一行给出 3 个正整数,分别是彩虹瓶的颜色数量 N(1)、临时货架的容量 M(<)、以及需要判断的发货顺序的数量 K。

随后 K 行,每行给出 N 个数字,是 1 到N 的一个排列,对应工厂的发货顺序。

一行中的数字都以空格分隔。

输出格式:

对每个发货顺序,如果工人可以愉快完工,就在一行中输出 YES;否则输出 NO

输入样例:

7 5 3
7 6 1 3 2 5 4
3 1 5 4 2 6 7
7 6 5 4 3 2 1
 

输出样例:

YES
NO
NO
/**********/
#include<bits/stdc++.h>
#include<stack>
using namespace std;
int main(){
    int n, m, k;
    cin >> n >> m >> k;
    while(k--){
        stack<int> st;//建立一个存储int类型数据名为st的栈
        int t = 1, x;
        bool flag = false;
        for(int i = 1; i <= n; i++){
            cin >> x;
            st.push(x);
            if(st.size() > m + 1) flag = true;
            while(!st.empty() && st.top() == t){
                t++;
                st.pop();//删除栈顶元素
             }            
        }
        if(st.size() == 0 && flag == false) cout << "YES"<<endl;
        else cout << "NO"<<endl;
    }
} 

 

posted @ 2020-11-15 21:07  西瓜0  阅读(337)  评论(0)    收藏  举报