(Week 15)综合复习(C++,字符串,数学)
文章目录
- T1 [Daimayuan]删删(C++,字符串)
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 数据规模
- 解题思路
- T2 [Daimayuan]快快变大(C++,区间DP)
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 数据规模
- 解题思路
- T3 [Daimayuan]饿饿 饭饭2(C++,数学)
- 输入格式
- 输出格式
- 数据规模
- 样例输入
- 样例输出
- 解题思路
- T4 [Daimayuan]子串分值和(C++,字符串)
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 数据规模
- 解题思路
- T5 [Daimayuan]蒟蒻(C++,STL)
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 数据规模
- 解题思路
- T6 [Daimayuan]锦标赛(C++,模拟)
- 输入格式
- 输出格式
- 样例输入1
- 样例输出1
- 样例输入输出2
- 数据规模
- 解题思路
- T7 [Daimayuan]可重排列(C++,字符串)
- 输入格式
- 输出格式
- 样例输入
- 样例输出
- 数据规模
- 解题思路
- T8 [Daimayuan]进制转换(C++)
- 题面
- 输入格式
- 输出格式
- 输入样例1
- 输出样例1
- 输入样例2
- 输出样例2
- 输入样例3
- 输出样例3
- 解题思路
- T9 [Daimayuan]循环子串(C++,字符串)
- 题目描述
- 输入格式
- 输出格式
- 数据范围
- 样例输入
- 样例输出
- 提示
- 解题思路
- T10 [Daimayuan]饿饿 饭饭之暑假大狂欢(C++,数学)
- 输入格式
- 输出格式
- 数据范围
- 样例输入
- 样例输出
- 解题思路
T1 [Daimayuan]删删(C++,字符串)
给定一个字符串,你可以删除多个(可以是 000) 相同 的字符,这样操作之后,你能否得到一个回文串?如果能,求最小化删除的个数。
输入格式
多组数据。
每一组数据包含两行,分别为字符串的长度 NNN,以及一个仅由小写字母组成的字符串 SSS。
输出格式
对于每一组数据,输出一行。
如果不可能得到一个回文串,输出 −1−1−1。反之则输出最小操作次数。
样例输入
4
8
bilibili
3
qwq
9
daimayuan
7
xcpcxpc
样例输出
1
0
-1
2
解释:
在第一个例子中,删除开头的 b
得到 ilibili
。
第二个例子中,qwq
本身已回文,不需要操作。
第三个例子中,可以看到 daimayuan
不能靠仅删除一种字符得到一个回文串。
数据规模
1≤N≤1051≤N≤10^51≤N≤105, 但保证 ∑N≤2×105\sum{N}≤2×10^5∑N≤2×105
解题思路
并没有巧妙的办法,就是简单的枚举262626种字母,找出其中删除的最少的即可
检测的思路如下:
从左右两端开始匹配
(1)if str[left] == str[right]
,left++, right--
(2)if str[left] != str[right]
如果左侧字符可以删除,那么删除左侧字符(left++
)
如果右侧字符可以删除,那么删除右侧字符(right--
)
如果左右都不可以删除,本轮删除失败,继续尝试下一个字符
#include <iostream>
#include <string>
using namespace std;
const int max_n = 2e5;
const string compose = "abcdefghijklmnopqrstuvwxyz";string str;
int n1, n2;int main() {cin >> n1;for (int i = 0; i < n1; i++) {cin >> n2 >> str;int ans = -1;for (char c: compose) {int l = 0, r = n2 - 1;int temp = 0;while (l <= r) {if (str[l] == str[r]) {l++; r--;}else {if (str[l] == c) {l++;temp++;}else if (str[r] == c) {r--;temp++;}else {temp = -1;break;}}}if (temp != -1)if (ans == -1) ans = temp;else ans = min(ans, temp);}cout << ans << endl;}return 0;
}
T2 [Daimayuan]快快变大(C++,区间DP)
给定一个长度为 nnn 的数组 a1,a2,…,ana_1,a_2,…,a_na1,a2,…,an,接下来进行 n−1n−1n−1 次操作。每次选择一个下标 xxx ,将 axa_xax 和 ax+1a_{x+1}ax+1 合并成 ax∗ax+1mod1000003a_x*a_{x+1}mod1000003ax∗ax+1mod1000003 ,并且你会获得 (ax−ax+1)2(a_x−a_{x+1})^2(ax−ax+1)2 的分数。
所以每次操作后,数组的长度将会减 111,当最后只剩下一个元素时停止操作。输出最终能获得的最大分数。
输入格式
第一行一个数字 nnn。
接下来一行 nnn 个整数 a1,a2,…,ana_1,a_2,…,a_na1,a2,…,an。
输出格式
一个数,表示答案。
样例输入
3
1 2 3
样例输出
26
数据规模
所有数据保证 1≤n≤300,1≤ai≤1061≤n≤300,1≤a_i≤10^61≤n≤300,1≤ai≤106。
解题思路
是没见过的船新版本DP
首先简单说明一下每轮操作的含义
对于要合并的长度为lenlenlen的区间[l,r][l,r][l,r],我们先分别合并左右两部分[l,k][l,k][l,k]和[k+1,r][k+1,r][k+1,r],那么容易知道:
dp[l][r] = max(dp[l][r], dp[l][k] + dp[k + 1][r] + (num[l][k] - num[k + 1][r]) ** 2)
也就是说合并区间[l,r][l,r][l,r]所得到的分数等于分别合并左右区间得到的分数再加上最后一次合并得到的分数
DPDPDP的基本思想就是对于任意一个长度为lenlenlen的区间(第一重循环),我们尝试其所有可能的划分(第三重循环),找出其中的最大值
第二重循环?它负责遍历每一个长度为lenlenlen的区间
而我们从小到大遍历lenlenlen,保证了在动态规划过程中,所有长度小于lenlenlen的区间最优结构已经得到,所以DPDPDP是可行的
AC代码如下
#include <iostream>
using namespace std;
const int mod_num = 1000003;
const int max_n = 300;long long num[max_n + 1][max_n + 1], dp[max_n + 1][max_n + 1];
int n;int main() {cin >> n;for (int i = 1; i <= n; i++) cin >> num[i][i];for (int i = 1; i < n; i++) {for (int j = i + 1; j <= n; j++) {num[i][j] = num[j][j];num[i][j] = (num[i][j] * num[i][j - 1]) % mod_num;}}for (int len = 2; len <= n; len++) {for (int l = 1, r = len; r <= n; l++, r++) {for (int k = l; k < r; k++) {dp[l][r] = max(dp[l][r], dp[l][k] + dp[k + 1][r] + (num[l][k] - num[k + 1][r]) * (num[l][k] - num[k + 1][r]));}}}cout << dp[1][n] << endl;return 0;
}
T3 [Daimayuan]饿饿 饭饭2(C++,数学)
接着《饿饿 饭饭》 的故事,在两天后,食堂的工作人员回来了,整个食堂又回到了原来井井有条的状态。
两个月后,由于天气越来越热,大家的胃口越来越小了,作为食堂管理员的CCCCCC非常担心孩子们的身体健康,所以他决定开展一个活动来调动孩子们吃饭的积极性,顺便考验一下孩子们的数学水平。活动内容如下:
先让每一个孩子都抽一个球,每一个球上有一个数字, 然后给这个孩子nnn个数字,每一个孩子都有无数次操作机会,每一次都会选中一个数将它乘上222,或者乘上333,请问这个孩子可以通过上面的操作将这nnn个数都变成相同的吗?
如果回答正确,这个回答正确的孩子就可以得到一份免费的午餐,但是这对于孩子们来说是在是太困难了,但是他们都想吃到免费的午餐,所以他们都想请你告诉他们正确的答案,让他们都迟到免费的午餐。
输入格式
第111行给定一个数TTT,表示有TTT个小孩子请你告诉他正确的答案。
第222到T+1T+1T+1行,第111个数是每个孩子抽到的数字nnn,第222到n+1n+1n+1个数是对应的nnn个数字。
输出格式
如果可以变成相同的,输出YES
。如果不能变成相同的,输出NO
。
数据规模
1≤T≤100,1≤n≤2×105,1≤ai≤1091≤T≤100,1≤n≤2×10^5,1≤a_i≤10^91≤T≤100,1≤n≤2×105,1≤ai≤109
数据保证∑i=1Tn≤2×105\sum^{T}_{i=1}{n}≤2×10^5∑i=1Tn≤2×105
样例输入
2
4 75 150 75 50
3 100 150 250
样例输出
YES
NO
解题思路
将每个数字拆解成两部分的乘积:2、32、32、3和其他数字
我们尝试把所有数字的第一部分除去,如果剩余部分相等,输出YES
反之,输出NO
AC代码如下
#include <iostream>
using namespace std;
const int max_t = 100;
const int max_n = 2e5;
const int max_a = 1e9;int t, n;
int num_arr[max_n];int main() {cin >> t;for (int i = 0; i < t; i++) {cin >> n;for (int j = 0; j < n; j++) {cin >> num_arr[j];while (num_arr[j] % 2 == 0) num_arr[j] /= 2;while (num_arr[j] % 3 == 0) num_arr[j] /= 3;}int j, same = num_arr[0];for (j = 1; j < n; j++) if (num_arr[j] != same) break;if (j != n) cout << "NO" << endl;else cout << "YES" << endl;}return 0;
}
T4 [Daimayuan]子串分值和(C++,字符串)
对于一个字符串 SSS ,我们定义 f(S)f(S)f(S) 为 SSS 中出现的不同的字符个数。 例如 f(aba)=2f(aba)=2f(aba)=2,f(abc)=3f(abc)=3f(abc)=3,f(aaa)=1f(aaa)=1f(aaa)=1。
现在给定一个字符串 SSS (假设长度为 lenlenlen),请你计算 ∑i=0len−1∑j=ilen−1f(S[i:j])\sum_{i=0}^{len−1}\sum_{j=i}^{len−1}f(S[i:j])∑i=0len−1∑j=ilen−1f(S[i:j]) 。
输入格式
输入一行包含一个由小写字母组成的字符串 SSS 。
输出格式
输出一个整数表示答案。
样例输入
ababc
样例输出
28
数据规模
所有数据保证字符串长度 len≤1000000len≤1000000len≤1000000,字符串下标从 000 到 len−1len−1len−1。
解题思路
直接正面求解每一个字符串的分值显然会TLETLETLE,那么尝试其他方法
我们的想法是单独处理每一个字符的分值,然后累加起来
直接去找该字符出现在多少字符串中并不容易,正难则反,我们尝试去寻找该字符没有出现在多少字符串中
举个例子ababc
,其中a
没有出现的字符串显然只有b
,b
,c
,bc
所以想要找到所有没有出现a
的字符串,我们只需要保存a
出现过的每一个位置,然后根据间隔字符串长度计算即可
AC代码如下
#include <iostream>
#include <vector>
using namespace std;
const string alpha = "abcdefghijklmnopqrstuvwxyz";
const int max_len = 1e6;vector<int>vocab[26];
long long ans = 0;inline long long calc(long long num) {return num * (num + 1) / 2;
}int main() {string str;cin >> str;int len = str.size();for (int i = 0; i < len; i++) {vocab[str[i] - 'a'].push_back(i);}for (char c : alpha) {long long sum = calc(len);if (!vocab[c - 'a'].empty()) {int l = 0;auto iter = vocab[c - 'a'].begin();while (iter != vocab[c - 'a'].end()) {sum -= calc(*iter - l);l = *iter + 1; iter++;}sum -= calc(len - l);ans += sum;}}cout << ans << endl;return 0;
}
后排提醒:要开long long
,否则会炸
T5 [Daimayuan]蒟蒻(C++,STL)
便利蜂的货架上摆了一排蒟蒻果冻,搞得鶸尛鱻眼花缭乱…
对于每个果冻,都有一个价格 www 和口感 ttt。鶸尛鱻有一个购物篮子,在挑选蒟蒻果冻的时候,他有以下几种操作:
- 操作 111:把一个价格为 www,口感为 ttt 的果冻放入篮子。
- 操作 222:拿出篮子中 最为廉价 的果冻。
- 操作 333:拿出篮子中 口感最差 的果冻。(ttt 越小,口感越差)
鶸尛鱻不喜欢重复,当操作 111 的 价格或口感 与篮中已有果冻重复时,他会立刻将其放回货架。
经过 nnn 次操作后,鶸尛鱻确定了要购买的若干果冻,请你帮他求出篮子里果冻的总价格。
输入格式
第 111 行一个正整数 nnn,代表操作次数。
第 222 行至第 (n+1n+1n+1)(n+1n+1n+1) 行,每行 一个或三个 整数,分别表示 opopop,www,ttt。
www 和 ttt 当且仅当 op=1op=1op=1 时存在。
输出格式
输出一个整数,表示篮子里果冻的总价格。
样例输入
6
1 1 1
1 2 5
2
1 3 3
3
1 5 2
样例输出
7
数据规模
所有数据保证 1≤n≤1051≤n≤10^51≤n≤105,1≤w,t≤1061≤w,t≤10^61≤w,t≤106,且保证输入合法。
解题思路
需要维护两个顺序,一个是价格的升序排序,一个是口感的升序排序
显然需要维护两个数组,关键在于使两个数组维持同步
利用map
的erase
操作可以根据键值删除元素的性质,可以很容易实现这一点
AC代码如下
#include <iostream>
#include <map>
using namespace std;
const int max_n = 1e5;
const int max_w = 1e6;
const int max_t = 1e6;map<int, int>m1, m2;
int w, t, n, op;
long long ans;int main() {cin >> n;for (int i = 0; i < n; i++) {cin >> op;if (op == 1) {cin >> w >> t;if (m1.count(w) == 0 && m2.count(t) == 0) {m1[w] = t;m2[t] = w;}}else if (op == 2) {m2.erase(m1.begin()->second);m1.erase(m1.begin());}else {m1.erase(m2.begin()->second);m2.erase(m2.begin());}}for (auto it : m1) {ans += (long long)(it.first);}cout << ans << endl;return 0;
}
T6 [Daimayuan]锦标赛(C++,模拟)
有nnn个玩家参加比赛,他们分别有能力值a1,a2,…,ana_1,a_2,…,a_na1,a2,…,an。
需要进行n−1n−1n−1轮比赛,每一轮在剩下的玩家里任选两个玩家i,ji,ji,j。如果∣ai−aj∣>K|a_i−a_j|>K∣ai−aj∣>K,那么其中能力值高的玩家会获胜,能力值低的玩家会被淘汰。如果∣ai−aj∣≤K|ai−aj|≤K∣ai−aj∣≤K,那么两个玩家都有可能获胜,另一个玩家被淘汰。
n−1n−1n−1轮比赛之后,只剩下一个玩家。问有多少个玩家可能是最后获胜的玩家。
输入格式
第一行,两个整数n,Kn,Kn,K,表示玩家的总人数,和获胜条件中的参数。
接下来一行nnn个整数a1,a2,…,ana_1,a_2,…,a_na1,a2,…,an,表示玩家的能力值。
输出格式
一个整数,表示最后可能获胜的玩家个数。
样例输入1
5 3
1 5 9 6 3
样例输出1
5
样例输入输出2
见下发文件。
数据规模
共101010组数据。
测试点111满足n≤5n≤5n≤5。
测试点222满足n≤10n≤10n≤10。
测试点3,4,53,4,53,4,5满足n≤1000n≤1000n≤1000。
对于100100100%的数据,满足n≤105n≤10^5n≤105,1≤ai,K≤1091≤a_i,K≤10^91≤ai,K≤109。
解题思路
能力值越高的越容易获胜,这是显然的
如果我们要计算最多有多少人可能获胜,自然要求出能获胜的最低能力值是多少
题目中给出了一个能够以弱胜强的最大能力差值KKK,能力差值大于KKK的时候弱的一方不可能获胜
所以我们让能力值大的先开始比赛,每次比赛都让能力值小的一方获胜(前提是能获胜)
最后当能力值小的一方不可能获胜的时候,我们就得到了最多有多少人可能获胜
AC代码如下
#include <iostream>
#include <algorithm>
using namespace std;
const int max_n = 1e5;
const int max_a = 1e9;
const int max_k = 1e9;int n;
long long k, gamer[max_n + 1];int main() {cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> gamer[i];}sort(gamer + 1, gamer + 1 + n, greater<long long>());long long ans = 1;long long buffer = gamer[1];for (int i = 2; i <= n; i++) {if (buffer - gamer[i] <= k) {ans++;buffer = gamer[i];}else break;}cout << ans << endl;return 0;
}
T7 [Daimayuan]可重排列(C++,字符串)
请按字典序从小到大的顺序输出所有序列,满足序列中有 p1p_1p1 个 111, p2p_2p2 个 222, ......... , pnp_npn 个 nnn。
输入格式
第一行一个整数 nnn。
第二行 nnn 个整数 p1p_1p1,p2p_2p2,…,pnp_npn。
输出格式
按字典序从小到大的顺序一行一行输出所有满足条件的序列,每行一个序列,相邻两个数字需要用空格隔开。
样例输入
3
1 2 2
样例输出
1 2 2 3 3
1 2 3 2 3
1 2 3 3 2
1 3 2 2 3
1 3 2 3 2
1 3 3 2 2
2 1 2 3 3
2 1 3 2 3
2 1 3 3 2
2 2 1 3 3
2 2 3 1 3
2 2 3 3 1
2 3 1 2 3
2 3 1 3 2
2 3 2 1 3
2 3 2 3 1
2 3 3 1 2
2 3 3 2 1
3 1 2 2 3
3 1 2 3 2
3 1 3 2 2
3 2 1 2 3
3 2 1 3 2
3 2 2 1 3
3 2 2 3 1
3 2 3 1 2
3 2 3 2 1
3 3 1 2 2
3 3 2 1 2
3 3 2 2 1
数据规模
对于 100100100% 的数据,保证 1≤n≤91≤n≤91≤n≤9,1≤pi≤91≤p_i≤91≤pi≤9,保证满足条件的序列个数不超过 10510^5105 个。
解题思路
这里我们隆重介绍一个新的偷懒工具,next_permutation
和prev_permutation
传入的参数是数组的起止位置指针,功能是对数组本身操作,得到下一个/上一个字典序排列
然后怎么做就不用我说了吧qwqqwqqwq
AC代码如下
#include <iostream>
#include <algorithm>
using namespace std;void read(string& str) {int n1, n2;cin >> n1;for (int i = 1; i <= n1; i++) {cin >> n2;str.append(n2, i + '0');}
}int main() {string str = ""; read(str);int len = str.size();do {for (int i = 0; i < len; i++) printf("%c ", str[i]);printf("\n");}while (next_permutation(str.begin(), str.end()));return 0;
}
T8 [Daimayuan]进制转换(C++)
题面
让我看看是谁不会进制转换,哦原来是我
以不同进制的形式输入 nnn 个非负整数,求出它们的和并以 mmm 进制的形式输出。
使用大写字母 A
~ Z
依次代表 101010 ~ 353535, 小写字母 a
~ z
依次代表 363636 ~ 616161。
输入格式
第一行输入两个整数 1≤n≤101≤n≤101≤n≤10 , 2≤m≤622≤m≤622≤m≤62 。
接下来 nnn 行,每行输入一个整数 2≤t≤622≤t≤622≤t≤62, 一个 ttt 进制数 0≤x≤1090≤x≤10^90≤x≤109。
输出格式
一个 mmm 进制数,为最终的结果
输入样例1
2 2
2 1
6 10
输出样例1
111
输入样例2
1 10
52 aA0
输出样例2
97864
输入样例3
2 52
36 AMD
52 YES
输出样例3
dJD
解题思路
由任意进制转换为十进制:
遍历每一位上的数字,乘以其位权重,累加
由十进制转换为任意进制:
对十进制数进行取模,余数插入转换后结果的左侧,然后将十进制数除以101010,循环操作直到十进制数为000
AC代码如下
#include <iostream>
#include <map>
#include <string>
using namespace std;
const int max_n = 10;
const int max_m = 62;
const int max_t = 62;
const int max_len = 64;
const string sign_set = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";int n, t;
long long m;
string num;
map<char, int>convert;
char output[max_len + 1];void init() {int len = sign_set.size();for (int i = 0; i < len; i++) {convert.insert(pair<char, int>(sign_set[i], i));}
}int main() {init();cin >> n >> m;long long decimal = 0;for (int i = 0; i < n; i++) {cin >> t >> num;int p = 1;int len = num.size() - 1;for (int i = len; i >= 0; i--) {decimal += (long long)(convert[num[i]] * p);p *= t;}}int idx = max_len - 1;while (decimal != 0) {output[idx--] = sign_set[decimal % m];decimal /= m;}cout << &(output[++idx]) << endl;return 0;
}
T9 [Daimayuan]循环子串(C++,字符串)
题目描述
一个字符串SSS是另一字符串TTT的循环子串当且仅当存在kkk, TTT所有字符循环右移kkk位后得到的新串T′T′T′,满足SSS是T′T′T′的子串。
例如: abc
是 cefab
的循环子串。 (cefab
循环右移222位得到abcef
, abc
是abcef
的子串)
一个串PPP是完全循环串当且仅当对于它的任一子串HHH, 都有HreverseHreverseHreverse是PPP的循环子串 (HreverseHreverseHreverse 为 HHH的倒转, 如abc
reversereversereverse后 为cba
)。
给一个长度为nnn的字符串, 判断它是不是完全循环串。
输入格式
第一行一个正整数ttt, 表示测试数据组数。
对于每一组数据,第一行一个正整数nnn, 表示字符串的长度。接下来一行一个长度为nnn的字符串. 仅包含小写字母。
输出格式
对于每组测试数据,如果这个串是完全循环串, 输出YES
,否则输出NO
。每组测试数据之间输出换行。
数据范围
对于所有数据 有 1≤t≤1001≤t≤1001≤t≤100, 1≤n≤1031≤n≤10^31≤n≤103, ∑n≤103\sum n≤10^3∑n≤103。
样例输入
2
4
ccca
11
eeaafbddfaa
样例输出
YES
NO
提示
-
本道题目只需要语法知识就可以解决。
-
任意子串是什么意思呢?
-
如果一个子串包含另一个子串,那么我们是不是只需要求出大子串的合法情况,就可以推出小子串的合法情况。
-
从大的子串向小的子串考虑 最大的子串是什么呢?
解题思路
假设abc
是循环子串,那么cba
也应该是循环子串,则有***abc***cba***
*注:这里将abc
与cba
调换也可以,*
的数量可以是任意的
进一步假设abcd
是循环子串,则有***abcd*dcba***
不难发现,如果abcd
是循环子串,则abc
自然也是循环子串
所以我们只需要证明最大的循环子串符合条件即可
也就是将给定字符串反转,然后寻找其是否存在
而对于可以循环右移的字符串,我们只需要将其复制然后拼接,在处理之后的字符串中寻找即可
AC代码如下
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int max_t = 100;
const int max_n = 1e3;string str;
int t, len;int main() {cin >> t;for (int i = 0; i < t; i++) {cin >> len >> str;string rev = str;reverse(rev.begin(), rev.end());str = str + str;if (str.find(rev) != -1)cout << "YES" << endl;elsecout << "NO" << endl;}return 0;
}
T10 [Daimayuan]饿饿 饭饭之暑假大狂欢(C++,数学)
故事接着《饿饿 饭饭 2》,又过了几个月,暑假来啦!!!
这天,cccccc和他的小伙伴们决定一起去游乐园玩,他们一天将游乐园的所有设施玩了个遍,甚至大摆锤,过山车他们还去了很多次,愉快的时间总是很短暂的,很快时间就来到了晚上,但是你以为一天的娱乐时光就这样结束了吗,那你就猜错啦。
晚上,游乐园晚上的partypartyparty就开始啦,其中有一个游戏环节,赢的人可以得到免费的西瓜,饿到不行的cccccc和他的小伙伴非常希望得到这个西瓜。
包括cccccc和他的小伙伴,有ttt个玩家参与了这个游戏,每个玩家都有一张带有数字的卡片。第iii张卡片上有nin_ini个数字,分别是m1,m2,...mnm_1,m_2,...m_nm1,m2,...mn。
游戏过程中,主持人从袋子里一个一个地取出编号的球。 他用洪亮而清晰的声音大声念出球的编号,然后把球收起来。 如果玩家的卡片上有对应的数字,就可以将它划掉。 最先从他的卡片上划掉所有数字的人获胜。 如果多人同时从他们的卡片上划掉所有数字,那么这些人都不能赢得比赛。 在游戏开始时,袋子里有 100100100 个球,编号从 111 到 100100100,所有球的编号都是不同的。
cccccc偷偷知道了每个玩家的数字。 想请你确定每个玩家是否可以在最有利于他的情况下赢得比赛。
输入格式
第一行给出一个数ttt,代表ttt个玩家。
接下来第二行到t+1t+1t+1行,每行第一个数为nin_ini,代表这个人手中有nnn个卡片,接下来给出序列a1...ana_1...a_na1...an表示这个人所拥有的卡片的数字。
输出格式
输出ttt行,每一行给出第iii个人在最有利的情况下是否能赢得比赛,可以输出YES
, 不可以输出NO
。
数据范围
1≤t≤100,1≤n≤100,1≤mi≤1001≤t≤100,1≤n≤100,1≤m_i≤1001≤t≤100,1≤n≤100,1≤mi≤100
样例输入
3
1 1
3 2 4 1
2 10 11
样例输出
YES
NO
YES
解题思路
不难发现,如果有一个人不能获胜,那么一定是有其他人的数字集合是他的子集(注:由于可以一次性划去多个数字,重复个数字直接按单个数字处理即可)
那么采用最简单的判断思路——暴力搜索
计算一下时间复杂度:最多需要判断100100100个人,对于每个人需要搜索其余999999个人,每人最多有100100100个数字,所以时间复杂度上限是10610^6106,可以接受
所以我们可以采用二维bool
数组存储每一个人数字,然后进行||
的操作:
num_arr[i][k] != (num_arr[i][k] || num_arr[j][k])
当且仅当num_arr[i][k]
没有k
数字(为falsefalsefalse),且num_arr[j][k]
有k
数字(为truetruetrue)时表达式为真
如果表达式为真,就可以停止判断了,因为二者有不同的元素;如果表达式始终为假,那么就说明j
的数字集合是i
的子集,i
不可能获胜
AC代码如下
#include <iostream>
using namespace std;
const int max_n = 100;
const int max_len = 100;bool num_arr[max_n + 1][max_len + 1];
int n, m;int main() {cin >> n;for (int i = 1; i <= n; i++) {cin >> m;int num;for (int j = 0; j < m; j++) {cin >> num;num_arr[i][num] = true;}}for (int i = 1; i <= n; i++) {bool win = true;for (int j = 1; j <= n; j++) {if (i == j) continue;int k;for (k = 1; k <= max_len; k++) {if (num_arr[i][k] != (num_arr[i][k] || num_arr[j][k])) {break;}}if (k == max_len + 1) {win = false;break;}}if (win) cout << "YES" << endl;else cout << "NO" << endl;}return 0;
}
相关文章:

(Week 15)综合复习(C++,字符串,数学)
文章目录T1 [Daimayuan]删删(C,字符串)输入格式输出格式样例输入样例输出数据规模解题思路T2 [Daimayuan]快快变大(C,区间DP)输入格式输出格式样例输入样例输出数据规模解题思路T3 [Daimayuan]饿饿 饭饭2&a…...

迪赛智慧数——柱状图(正负条形图):“光棍”排行榜TOP10省份
效果图 中国单身男女最多的省份是广东,广东的人口是全国最多的。人口多了,单身的人也会多,单身女性324万,男性498万。全国第二的省份是四川省,单身女性256万,单身男性296万。 数据源:静态数据…...

IDEA集成chatGTP让你编码如虎添翼
第一步,打开您的IDEA, 打开首选项(Preference) -> 插件(Plugin) 在插件市场搜索 chatGPT, 点击安装 安装完毕后会提示您重启IDE, 重启IDEA. 重启后您会发现窗口,右边条上 竖着挂着个chatGPT按钮了。 第二步、配置APIkey或accessToken(二选一,推荐accessToken无费用…...

Python3 os.close() 方法、Python3 File readline() 方法
Python3 os.close() 方法 概述 os.close() 方法用于关闭指定的文件描述符 fd。 语法 close()方法语法格式如下: os.close(fd);参数 fd -- 文件描述符。 返回值 该方法没有返回值。 实例 以下实例演示了 close() 方法的使用: #!/usr/bin/python3…...

Vision Pro 自己写的一些自定义工具(c#)
目录前言一、保存图片工具1、展示2、源码下载地址二、3D图片格式转化1、展示2、源码下载地址三、所有工具汇总下载地址前言 自己用c#写的一些visionPro自定义工具,便于使用的时候直接拿出来,后续会不断添加新的工具。 想看怎么使用c#写visionPro自定义…...

ARM/FPGA/DSP板卡选型大全,总有一款适合您
创龙科技ARM/FPGA/DSP嵌入式板卡选型大全2023.2版本正式发布!接下来,跟着我们一起看看有哪些亮点吧! 6大主流工业处理器原厂 创龙科技现有30多条产品线,覆盖工业自动化、能源电力、仪器仪表、通信、医疗、安防等工业领域,与6大主流工业处理器原厂强强联合,包括德州仪器…...

【C语言蓝桥杯每日一题】—— 既约分数
【C语言蓝桥杯每日一题】—— 既约分数😎前言🙌既约分数🙌递归版解题代码:😍非递归版解题代码:😍总结撒花💞既约分数😎)😎博客昵称:博客小梦 &…...

【机器学习】线性回归
文章目录前言一、单变量线性回归1.导入必要的库2.读取数据3.绘制散点图4.划分数据5.定义模型函数6.定义损失函数7.求权重向量w7.1 梯度下降函数7.2 最小二乘法8.训练模型9.绘制预测曲线10.试试正则化11.绘制预测曲线12.试试sklearn库二、多变量线性回归1.导入库2.读取数据3.划分…...

用ChatGPT学习多传感器融合中的基础知识
困惑与解答: 问题:匈牙利算法中的增广矩阵路径是什么意思 解答: 匈牙利算法是解决二分图最大匹配的经典算法之一。其中的增广矩阵路径指的是在当前匹配下,从一个未匹配节点开始,沿着交替路(交替路是指依次…...

PyCharm2020介绍
PyCharm2020PyCharm2020安装过程PyCharm2020安装包1、PyCharm2020介绍2、PyCharm2020特点3、PyCharm2020特点4、PyCharm2020PyCharm2020安装过程 PyCharm2020安装过程安装步骤点击此链接。 PyCharm2020安装包 链接:https://pan.baidu.com/s/19R3nJx6wMyNBU9oY4N4n…...

Le Potato + Jumbospot MMDVM热点盒子
最近才留意到,树莓派受到编程圈一定瞩目之后,智慧的同胞早已悄咪咪的搞了一堆xx派出来,本来对于香橙派,苹果派,土豆派和香蕉派是不感冒的,但是因为最近树莓派夸张的二级市场价格和断供,终于还是…...

蓝桥杯第19天(Python)(疯狂刷题第2天)
题型: 1.思维题/杂题:数学公式,分析题意,找规律 2.BFS/DFS:广搜(递归实现),深搜(deque实现) 3.简单数论:模,素数(只需要…...

(五)手把手带你搭建精美简洁的个人时间管理网站—基于Axure的首页原型设计
🌟所属专栏:献给榕榕🐔作者简介:rchjr——五带信管菜只因一枚 😮前言:该专栏系为女友准备的,里面会不定时发一些讨好她的技术作品,感兴趣的小伙伴可以关注一下~👉文章简介…...

阿里面试:为什么MySQL不建议使用delete删除数据?
MySQL是一种关系型数据库管理系统,它的数据存储是基于磁盘上的文件系统实现的。MySQL将数据存储在表中,每个表由一系列的行和列组成。每一行表示一个记录,每一列表示一个字段。表的结构由其列名、数据类型、索引等信息组成。 MySQL的数据存储…...

低代码开发公司:用科技强力开启产业分工新时代!
实现办公自动化,是不少企业的共同追求。低代码开发公司会遵循时代发展规律,注入强劲的科技新生力量,在低代码开发市场厚积爆发、努力奋斗,推动企业数字化转型升级,为每一个企业的办公自动化升级创新贡献应有的力量。 一…...

参考mfa官方文档实践笔记(亲测)
按顺序执行以下指令: conda create -n aligner -c conda-forge montreal-forced-alignerconda config --add channels conda-forgeconda activate alignerconda install pytorch torchvision torchaudio pytorch-cuda11.7 -c pytorch -c nvidia 如果报错࿱…...

【 第六章 拦截器,注解配置springMVC,springMVC执行流程】
第六章 拦截器,注解配置springMVC,springMVC执行流程 1.拦截器: ①springMVC中的拦截器用于拦截控制器方法的执行。 ②springMVC的拦截器需要实现HandlerInterceptor或者继承HandlerInterceptorAdapter类。 ③springMVC的拦截器必须在spring…...

一种编译器视角下的python性能优化
“Life is short,You need python”!老码农很喜欢python的优雅,然而,在生产环境中,Python这样的没有优先考虑性能构建优化的动态语言特性可能是危险的,因此,流行的高性能库如TensorFlow 或PyTor…...

太逼真!这个韩国虚拟女团你追不追?
“她们看上去太像真人了”, 韩国虚拟女团MAVE的首支MV和打歌舞台引发网友阵阵惊呼。现在,她们的舞蹈已经有真人在挑战了。 这一组虚拟人的“逼真”倒不在脸,主要是MAVE女团的舞台动作接近自然,不放近景看,基本可以达到…...

安全与道路测试:自动驾驶系统安全性探究
随着自动驾驶技术的迅速发展,如何确保自动驾驶系统的安全性已成为业界关注的焦点。本文将探讨自动驾驶系统的潜在风险、安全设计原则和道路测试要求。 潜在风险 自动驾驶系统在改善交通安全和提高出行效率方面具有巨大潜力,但其安全性仍面临许多挑战&a…...

chatGPT学英语,真香!!!
文章目录学习目标学习内容目标方式过程学习时间学习产出学习目标 能够在三个月的练习后,和真人外教比较流畅的沟通! 最近chatGPT实在是太火了,各种事情都能干,能改论文、写代码和翻译。 看到B站很多教程教我们直接用chatGPT进行…...

12 Cache Memory
内存的层次结构 计算机内存的层级结构是一种将不同类型的存储设备按照速度、容量和访问时间组织起来的方式。这种层级结构提高了计算机的性能,使得处理器能够高效地访问数据。通常,内存层级结构可分为以下几个层次: 寄存器:寄存器…...

【CSS系列】第一章 · CSS基础
写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正࿰…...

【Java代码审计】表达式注入
1 前置知识 1.1 EL表达式 EL表达式主要功能: 获取数据:可以从JSP四大作用域中获取数据执行运算:执行一些关系运算,逻辑运算,算术运算获取web开发常用对象:通过内置 的11个隐式对象获取想要的数据调用jav…...

Python-GEE遥感云大数据分析、管理与可视化
Python-GEE遥感云大数据分析、管理与可视化近年来遥感技术得到了突飞猛进的发展,航天、航空、临近空间等多遥感平台不断增加,数据的空间、时间、光谱分辨率不断提高,数据量猛增,遥感数据已经越来越具有大数据特征。遥感大数据的出…...

信息学奥赛一本通 1375:骑马修栅栏(fence) | 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences
【题目链接】 ybt 1375:骑马修栅栏(fence) 洛谷 P2731 [USACO3.3]骑马修栅栏 Riding the Fences 【题目考点】 1. 图论:欧拉回路 欧拉回路存在的条件:图中所有顶点的度都是偶数欧拉路径存在的条件:图中只有两个度为奇数的顶点…...

Spring Boot 应用的打包和发布
1. 创建项目(example-fast) 基于 Spring Boot 创建一个 WEB 项目 example-fast。 2. 编译打包 2.1 采用 IDEA 集成的 Maven 环境来对 Spring Boot 项目编译打包,可谓是超级 easy 2.2 mvn 命令打包 # mvn clean 清理编译 # install 打包 #…...

linux:iptables (3) 命令行操练(一)
目录 1.命令行手册查缺补漏 2.开始练习,从最陌生的参数练习开启 2.1 --list-rules -S :打印链或所有链中的规则 2.2 --zero -Z 链或所有链中的零计数器 2.3 --policy -P 修改默认链的默认规则 2.4 --new -N 接下来练习添加和删除自定义链 1.命令行手册查缺补…...

synchronized(this) 与synchronized(class) 有啥区别
前言 synchronized(this) 与 synchronized(class) 相同处:均对代码加锁,实现互斥性。synchronized(this) 与 synchronized(class) 区别:作用域不同。 synchronized (this) synchronized(this)使用的是对象锁。this为关键词,表示…...

BOSS直拒、失联招聘,消失的“金三银四”,失业的测试人出路在哪里?
裁员潮涌,经济严冬。最近很多测试人过得并不好,行业缩水对测试岗位影响很直接干脆,究其原因还是测试门槛在IT行业较低,同质化测试人员比较多。但实际上成为一位好测试却有着较高的门槛,一名优秀的测试应当对产品的深层…...