2024.3.11|Codeforces Round 933(Div.3)

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+csk .
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 2in1 ) 并赋值:

  • 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 1t104 ) - 测试中的测试用例数。
每个案例的第一行包含一个整数 n n n( 3 ≤ n ≤ 2 ⋅ 1 0 5 3 \le n \le 2 \cdot 10^5 3n2105 ) - 数组中的元素个数。
每个案例的第二行包含 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 0aj109 ) - 数组中的元素。( 0 ≤ a j ≤ 1 0 9 0 \le a j \le 10^9 0aj109 ) - 数组中的元素。
保证所有测试用例中 n n n 的值之和不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2105

输出
对于每个测试用例,如果可以通过所述操作使数组的所有元素为零,则输出 “是”。否则,输出 “否”。
每个字母可以以任何大小写(小写或大写)输出。例如,字符串 “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 2in1 ) 并赋值:

  • a i − 1 = a i − 1 − 1 a {i - 1} = a{i - 1} - 1 ai1=ai11
  • a i = a i − 2 ai = ai - 2 ai=ai2
  • a i + 1 = a i + 1 − 1 ai + 1 = ai+1 - 1 ai+1=ai+11

鲁道夫可以任意多次使用这个运算。任何索引 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 1t104 ) - 测试用例的数量。接下来是测试用例的说明。

每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 1 0 6 1 \le n \le 10^6 1n106 ) - 字符串 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

心有猛虎,细嗅蔷薇。再见了朋友~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值