(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…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...
js 设置3秒后执行
如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...