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 K 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的正整数,每个用户i(i=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; } }

浙公网安备 33010602011771号