牛客普及组模拟赛二T A & B

it2025-04-09  20

小目录

链接A-面试题目描述输入输出样例输入样例输出数据范围或提示思路代码 B-纸牌游戏题目描述输入输出样例输入样例输出数据范围或提示思路代码

链接

A − 面 试 A-面试 A B − 纸 牌 游 戏 B-纸牌游戏 B

A-面试

题目描述

给出一个长度为 4 4 4的字符串,若其中 ′ A ′ 'A' A的个数大于等于 3 3 3且没有 ‘ D ’ ‘D’ D,输出 " s p    o f f e r " "sp\ \ offer" "sp  offer" 若是有一个 " D " "D" "D"或两个 “ C ” “C” C,输出 “ f a i l e d ” “failed” failed 上述情况都没有发生则输出 " o f f e r " "offer" "offer" 都不包含引号

输入

第一行输入一个 T,代表面试者的个数。

接下来有 T 行,每行都有一个长度为 4 的字符串,每个位置的字符分别代表面试者每一轮的发挥。

输出

输出 T 行,分别表示 T 个面试者的面试结果。如果面试失败,输出failed,如果面试通过,但不是 special offer,则输出offer,否则输出 sp offer。

样例输入

2 AAAB ADAA

样例输出

sp offer failed

数据范围或提示

T <= 1000

思路

直接模拟就好啦,就是要记得A的个数是大于等于3,而不是只能等于3

代码

#include<iostream> #include<cstring> #include<cstdio> #include<string> using namespace std; int suma, sumc, b, T; string s; int main() { scanf("%d", &T); for (int i = 1; i <= T; ++i) { suma = sumc = b = 0; cin>>s; for (int j = 0; j < s.length(); ++j) { if (s[j] == 'A') suma++; if (s[j] == 'C') sumc++; if (s[j] == 'D' || sumc == 2) { printf("failed\n"); b = 1; break; } } if (!b && suma >= 3) printf("sp offer\n"); else if (!b) printf("offer\n"); } return 0; }

B-纸牌游戏

题目描述

公司举办团建活动,许多人在一起玩一个纸牌游戏。规则如下: 总共有 n 个人,每个人初始有 n 张牌。每一轮从第一个人开始轮流操作,第 i 个人每次操作必须选择 m i n ( p e o p l e − 1 , a i ) min(people-1,a_i) min(people1,ai) 个不同的人,分别从他们手中拿走一张牌。其中people 为游戏现存人数,手上没有牌的人立即被淘汰出局。大家希望有尽可能多的人出局,游戏无限的进行下去,问最终游戏中最少还有几个人没有出局。 注意:不能从自己手中拿牌

输入

第一行输入一个数字 n n n, 代表游戏的总人数。接下来输入 n n n 个数字,分别代表 a i a_i ai

输出

输出一行一个整数表示游戏最终最少剩几个人。

样例输入

2 1 2

样例输出

2

数据范围或提示

样例解释两个人只能互相拿对方的一张牌,游戏永远进行下去。

数据范围 对于 20% 的数据,满足 n ≤ 2 n≤2 n2

对于 40% 的数据,满足 n ≤ 3 n≤3 n3

对于 100% 的数据,满足 n ≤ 1 0 5 , 1 ≤ a i ≤ 1 0 9 n≤10^5, 1≤a_i≤10^9 n105,1ai109

思路

我一开始想了正解结果认为不会这么简单就否认掉了。。。 然后后面实在没想出来别的就只好手动模拟了一下n是2和3的情况,卑微拿40分

我们将数列以 a i a_i ai从小到大排序,因为每个人都想要更多人死去,那就是说会选择 a i a_i ai小的 那么第 i i i个人(排序后)就会被 n − i n - i ni个人剥削,那么我们考虑一个人是否能存活 一个人能存活当且仅当它的收入>它的支出 即 a i a_i ai> n − i n - i ni 因此题目就解决了

代码

#include<algorithm> #include<iostream> #include<cstdio> using namespace std; int n, a[1000005]; int main() { scanf("%d", &n); for (int i = 1; i <= n; ++i) scanf("%d", &a[i]); sort(a + 1, a + n + 1); for (int i = 1; i <= n; ++i) if (a[i] >= n - i) { printf("%d", n - i + 1); return 0; } return 0; }
最新回复(0)