L1-020 帅到没朋友
当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友。本题就要求你找出那些帅到没有朋友的人。
输入格式:
输入第一行给出一个正整数N
(≤100),是已知朋友圈的个数;随后N
行,每行首先给出一个正整数K
(≤1000),为朋友圈中的人数,然后列出一个朋友圈内的所有人——为方便起见,每人对应一个ID号,为5位数字(从00000到99999),ID间以空格分隔;之后给出一个正整数M
(≤10000),为待查询的人数;随后一行中列出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<iostream> #include<unordered_set> #include <iomanip> using namespace std; int main() { unordered_set<int>rank; int n, m; int check, sum = 0; int num; cin >> n; for (int i = 0; i < n; i++) { cin >> m; if(m>=2) { for (int j = 0; j < m; j++) { cin >> num; rank.emplace(num); } } else { cin>>num; } } cin >> check; for (int i = 0; i < check ; i++) { cin >> num; if (rank.find(num) == rank.end()) { if (sum != 0)cout << " "; rank.emplace(num); sum++; cout << setw(5) << setfill('0') << num; } } if (sum == 0) cout << "No one is handsome"; }
L1-025 正整数A+B
题的目标很简单,就是求两个正整数A
和B
的和,其中A
和B
都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。
输入格式:
输入在一行给出A
和B
,其间以空格分开。问题是A
和B
不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。
注意:我们把输入中出现的第1个空格认为是A
和B
的分隔。题目保证至少存在一个空格,并且B
不是一个空字符串。
输出格式:
如果输入的确是两个正整数,则按格式A + B = 和
输出。如果某个输入不合要求,则在相应位置输出?
,显然此时和也是?
。
输入样例1:
123 456
输出样例1:
123 + 456 = 579
输入样例2:
22. 18
输出样例2:
? + 18 = ?
输入样例3:
-100 blabla bla...33
输出样例3:
? + ? = ?
核心思路;
分离出数组A和数组B,分别对其判断是否符合要求
代码
#include<iostream> #include<iomanip> #include<string> using namespace std; int main() { string ab; getline(cin, ab); string a, b; for (int i = 0; i < ab.length(); i++) { if (ab[i] == ' ') { break; } a = a + ab[i]; } for (int i = a.length()+1; i < ab.length(); i++) { b =b+ ab[i]; } for (int i = 0; i < a.length(); i++) { if (!isdigit(a[i]) || stoi(a) <= 0 || stoi(a) > 1000) { a = "?"; break; } } for (int i = 0; i < b.length(); i++) { if (!isdigit(b[i]) || stoi(b) <= 0 || stoi(b) > 1000) { b = "?"; break; } } if (a == "?" || b == "?") { cout << a << " + " << b << " = ?"; } else cout << a << " + " << b << " = "<<stoi(a)+stoi(b); }
L1-030 一帮一
“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
输入格式:
输入第一行给出正偶数N
(≤50),即全班学生的人数。此后N
行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。
输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。
输入样例:
8 0 Amy 1 Tom 1 Bill 0 Cindy 0 Maya 1 John 1 Jack 0 Linda
输出样例:
Amy Jack Tom Linda Bill Maya Cindy John
代码
#include<iostream> #include<iomanip> #include<vector> using namespace std; struct stu { int sex; string name; }; int main() { vector<stu> rank; int n; cin >> n; for (int i = 0; i < n; i++) { stu x; cin >> x.sex >> x.name; rank.emplace_back(x); } for (int i = 0; i < rank.size(); i++) { for (int j = rank.size() - 1; j> 0; j--) { if (rank[i].sex != rank[j].sex) { cout << rank[i].name << " " << rank[j].name<<endl; rank.erase(rank.begin() + j); break; } } } }