2024.3.11|Codeforces Round 933(Div.3)
A. Rudolf and the Ticket
B. Rudolf and 121
C. Rudolf and the Ugly String
D. Rudolf and the Ball Game
E. Rudolf and k Bridges
F. Rudolf and Imbalance
G. Rudolf and Subway
心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。
Rudolf and the Ticket
题目:
鲁道夫要去拜访伯纳德,他决定乘坐地铁去找他。车票可以在接受两个硬币的机器上购买,这两个硬币的总和不超过
k
k
k 。
鲁道夫有两个装硬币的口袋。左边口袋里有 n n n 枚面值为 b 1 , b 2 , … , b n b_1, b_2, \dots, b_n b1,b2,…,bn 的硬币。右边口袋里有 m m m 枚面额为 c 1 , c 2 , … , c m c_1, c_2, \dots, c_m c1,c2,…,cm 的硬币。他想从左边口袋和右边口袋各取出一枚硬币(共两枚)。
请帮助鲁道夫判断有多少种方法可以选择指数
f
f
f 和
s
s
s ,从而使
b
f
+
c
s
≤
k
b_f + c_s \le k
bf+cs≤k .
Rudolf 有一个由
n
n
n 个整数组成的数组
a
a
a,元素的编号从
1
1
1 到
n
n
n 。
在一次操作中,他可以选择索引 i i i ( 2 ≤ i ≤ n − 1 2 \le i \le n - 1 2≤i≤n−1 ) 并赋值:
- a i-1 = ai-1 - 1
- a i = ai - 2
- a i+1 = a i+1 - 1
鲁道夫可以任意多次使用这个运算。任何索引 i i i 都可以使用 0 次或更多次。
他能用这个运算使数组中的所有元素都等于零吗?
输入
输入的第一行包含一个整数
t
t
t (
1
≤
t
≤
1
0
4
1 \le t \le 10^4
1≤t≤104 ) - 测试中的测试用例数。
每个案例的第一行包含一个整数
n
n
n(
3
≤
n
≤
2
⋅
1
0
5
3 \le n \le 2 \cdot 10^5
3≤n≤2⋅105 ) - 数组中的元素个数。
每个案例的第二行包含
n
n
n 个整数
a
1
,
a
2
,
a
n
a~1~, a~2~,a~n~
a 1 ,a 2 ,a n (
0
≤
a
j
≤
1
0
9
0 \le a j \le 10^9
0≤aj≤109 ) - 数组中的元素。(
0
≤
a
j
≤
1
0
9
0 \le a j \le 10^9
0≤aj≤109 ) - 数组中的元素。
保证所有测试用例中
n
n
n 的值之和不超过
2
⋅
1
0
5
2 \cdot 10^5
2⋅105 。
输出
对于每个测试用例,如果可以通过所述操作使数组的所有元素为零,则输出 “是”。否则,输出 “否”。
每个字母可以以任何大小写(小写或大写)输出。例如,字符串 “yEs”、“yes”、"Yes "和 "YES "将被视为肯定答案。
注
请注意,成对的硬币表示数组中硬币的指数,而不是面值。
在第一个测试案例中,鲁道夫可以选择以下硬币对: [ 1 , 1 ] , [ 1 , 2 ] , [ 1 , 4 ] , [ 2 , 1 ] , [ 2 , 2 ] , [ 2 , 4 ] [1, 1], [1, 2], [1, 4], [2, 1], [2, 2], [2, 4] [1,1],[1,2],[1,4],[2,1],[2,2],[2,4].
在第二个测试案例中,鲁道夫无论如何都无法从每个口袋中选择一枚硬币,因为第一个和第二个数组中任意两个元素的总和都会超过 k = 4 k=4 k=4的值。
在第三个测试案例中,鲁道夫可以选择: [ 1 , 1 ] , [ 2 , 1 ] , [ 3 , 1 ] , [ 4 , 1 ] [1, 1], [2, 1], [3, 1], [4, 1] [1,1],[2,1],[3,1],[4,1].
在第四个测试案例中,鲁道夫可以从左边口袋和右边口袋中任选一枚硬币。
示例1
input
4
4 4 8
1 5 10 14
2 1 8 1
2 3 4
4 8
1 2 3
4 2 7
1 1 1 1
2 7
3 4 2000
1 1 1
1 1 1 1
output
6
0
4
12
注意:
A题是签到题,模拟即可。
实践代码:
void solve(){
int n,m,k;cin>>n>>m>>k;
vector<int> b(n),c(m);
for(int i=0;i<n;i++) cin>>b[i];
for(int i=0;i<m;i++) cin>>c[i];
int cnt=0;
sort(b.begin(),b.end());//将左钱袋排序
sort(c.begin(),c.end());//将右钱袋排序
if(b[0]+c[0]>k) {cout<<cnt<<endl;return;}//如果两个袋子的第一个硬币相加就大于k,那么就不用再比较了,直接输出0
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(b[i]+c[j]<=k) cnt++;//两枚硬币总和不大于k就视为一种方法
if(b[i]+c[j]>k) break;//如果此时两枚硬币总和大于k,那么之后的一定大于k(因为已排过序)
}
}
cout<<cnt<<endl;
}
优化:
void solve(){
int n,m,k;cin>>n>>m>>k;
vector<int>b(n),c(m);
for(int i=0;i<n;i++) cin>>b[i];
for(int i=0;i<m;i++) cin>>c[i];
int ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
ans+=b[i]+c[j]<=k;
}
}
cout<<ans<<endl;
}
Rudolf and 121
题目:
Rudolf 有一个由
n
n
n 个整数组成的数组
a
a
a ,元素的编号从
1
1
1 到
n
n
n 。
在一次操作中,他可以选择索引 i i i ( 2 ≤ i ≤ n − 1 2 \le i \le n - 1 2≤i≤n−1 ) 并赋值:
- a i − 1 = a i − 1 − 1 a {i - 1} = a{i - 1} - 1 ai−1=ai−1−1
- a i = a i − 2 ai = ai - 2 ai=ai−2
- a i + 1 = a i + 1 − 1 ai + 1 = ai+1 - 1 ai+1=ai+1−1
鲁道夫可以任意多次使用这个运算。任何索引 i i i 都可以使用 0 次或更多次。
他能用这个运算使数组中的所有元素都等于零吗?
输入描述:
第一行输入三个正整数n,m,x,代表小红做这道题的输入部分。
接下来的n行,每行输入m个非负整数,代表小红构造的矩阵。
1≤n,m≤100
0≤x≤109
保证x是偶数。小红输出的元素保证不超过109
输出描述:
如果小红成功通过了本题,则输出"accepted"。否则输出"wrong answer"
示例1
input
7
5
1 3 5 5 2
5
2 4 4 5 1
5
0 1 3 3 1
6
5 6 0 2 3 0
4
1 2 7 2
3
7 1 0
4
1 1 1 1
output
YES
NO
YES
NO
NO
NO
NO
注意:
B题注意:看似它给你的一次操作是改变数组的三个元素的值,但仔细一想,数组的第一个元素是不是必须且只能被它下一个元素归0呢,即i-1只能操作i来使其归0,所以可以从数组第一个元素开始遍历数组,当遍历到i时,假设它需要x次归0,那么a[i+1]需要减2*x,a[i+2]需要减x。
实践代码:
void solve(){
int n;cin>>n;
vector<int> a(n);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++){
if(a[i]<0) {cout<<"NO"<<endl;return;}
if(i+2>=n&&a[i]!=0) {cout<<"NO"<<endl;return;}
if(a[i]>0){
a[i+1]-=2*a[i];
a[i+2]-=a[i];
a[i]=0;
}
}
cout<<"YES"<<endl;
}
Rudolf and the Ugly String
题目:
鲁道夫有一个长度为
n
n
n 的字符串
s
s
s 。如果字符串
s
s
s 包含子串
†
^\dagger
† "pie "或子串 “map”,鲁道夫就会认为这个字符串
s
s
s 很丑。派 "或子串 “map”,否则字符串
s
s
s 将被视为优美。
例如,“ppiee”、“mmap”、"dfpiefghmap "是丑字符串,而 “mathp”、"ppiiee "是美字符串。
Rudolf 希望通过删除一些字符来缩短字符串 s s s 使其美观。
主角不喜欢吃力,所以他要求你删除最少的字符,使字符串变得漂亮。他可以删除字符串中任何位置的字符(不仅仅是字符串的开头或结尾)。
†
^\dagger
† 如果字符串
b
b
b 中存在一个连续的字符段等于
a
a
a ,则字符串
a
a
a 是
b
b
b 的子串。
输入
第一行包含一个整数
t
t
t (
1
≤
t
≤
1
0
4
1 \le t \le 10^4
1≤t≤104 ) - 测试用例的数量。接下来是测试用例的说明。
每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1≤n≤106 ) - 字符串 s s s 的长度。
每个测试用例的下一行包含长度为 n n n 的字符串 s s s 。字符串 s s s 由小写拉丁字母组成。
所有测试用例的
n
n
n 之和不超过
1
0
6
10^6
106 。
输出
对于每个测试用例,输出一个整数 - 为使字符串
s
s
s 优美而需要删除的最少字符数。如果字符串最初是优美的,则输出
0
0
0。
示例1
Input
6
9
mmapnapie
9
azabazapi
8
mappppie
18
mapmapmapmapmapmap
1
p
11
pppiepieeee
Output
2
0
2
6
0
2
注
例如,在第一个测试用例中,可以删除第
4
4
4 和
9
9
9 个字符,使字符串更美观。
在第二个测试用例中,字符串已经很漂亮了。
注意:
C题纯贪心,如果是map和pie时,我们分别减去"a"和"i"是最优解,但它们有一个公共元p,当特例"mapie"出现时,显然你删掉"p"才是最优情况。==
实践代码:
void solve(){
int n;cin>>n;
string s;cin>>s;
int ans=0;
for(int i=0;i<n;i++){
if(i+3<=n&&s.substr(i,3)=="pie"){
ans++;
}
if(i+3<=n&&s.substr(i,3)=="map"){
ans++;
}
if(i+5<=n&&s.substr(i,5)=="mapie"){
ans--;
}
}
cout<<ans<<endl;
}
D. Rudolf and the Ball Game
题目:
输入描述:
输出描述:
示例1
输入
输出
说明
注意:
实践代码:
Rudolf and k Bridges
题目:
输入描述:
示例1
输入
输出
**说明**备注
注意:
实践代码:
Rudolf and Imbalance
题目:
输入描述:
输出描述:
示例1
输入
输出
说明
注意:
实践代码:
Rudolf and Subway
心有猛虎,细嗅蔷薇。再见了朋友~