Codeforces Round #740 Div. 2 A B C D1 D2

Posted a碟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #740 Div. 2 A B C D1 D2相关的知识,希望对你有一定的参考价值。

目录

A. Simply Strange Sort

题目链接

题意: 给你一个从 1 − n 1-n 1n的排列数组, n n n的长度是奇数,按照题目给定的要求对序列进行变换,求多少次变换之后能够使得数组递增。

分析: 简单的模拟题,主要是要读懂题意, f ( i ) f(i) f(i)代表如果 a i > a i + 1 a_i > a_i+1 ai>ai+1,则两者可以交换。每一次迭代变换,第i次的迭代规则:如果 i i i是奇数,对 1 , 3 , 5 , 7 , 9 1,3,5,7,9 1,3,5,7,9…奇数的位置的数字可以进行 f ( 1 ) , f ( 3 ) f(1),f(3) f(1),f(3)…的操作。如果i是偶数,对 2 , 4 , 6 , 8 , 10 2,4,6,8,10 2,4,6,8,10…偶数的位置可以进行 f ( 2 ) , f ( 4 ) f(2),f(4) f(2),f(4)的操作。按照题意模拟。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1005;
int a[N],n;
bool check()
    for(int i=1;i<=n;i++)
        if(a[i]==i)continue;
        return false;
    
    return true;

int main()

    int t;scanf("%d",&t);
    while(t--)
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        int cnt=0,flag=0;
        while(1)
            if(check())break;
            flag^=1;
            int i=(flag?1:2);
            for(;i<=n-1;i+=2)
                if(a[i]>a[i+1])swap(a[i],a[i+1]);
            
            cnt++;
        
        printf("%d\\n",cnt);
    
    return 0;

B. Charmed by the Game

题目链接

题意: 这个题太难读了…就是说有两个人打球,玩家轮流发球,发球方赢了,就说这一方 holds;接球方赢了,就说这一方 b r e a k s breaks breaks。题目告诉我们两人的得分 a , b a,b a,b。求可能的 b r e a k s breaks breaks的次数,也就是求接球方可能的拿分次数,也就是后手赢球的可能次数。

分析: 知道了两人的得分 a , b a,b a,b,那么我们就能知道总的比赛场次是 a + b a+b a+b,先手的发球次数是 ⌈ a + b 2 ⌉ \\lceil \\fraca+b2 \\rceil 2a+b p p p,后手的发球次数是 ⌊ a + b 2 ⌋ \\lfloor \\fraca+b2 \\rfloor 2a+b q q q
我们不知道谁先发球,先假设 A l i c e Alice Alice先发球,设 x x x A l i c e Alice Alice发球的失球个数( 0 ≤ x ≤ p 0\\leq x \\leq p 0xp), y y y B o r y s Borys Borys的失球个数( 0 ≤ y ≤ q 0\\leq y \\leq q 0yq)。
如果 A l i c e Alice Alice先手发球,枚举 A l i c e Alice Alice先手发球的失球个数 x x x(也就是后手赢球)从 1 1 1 p p p,因为有 a = ( p − x ) + y a=(p-x)+y a=(px)+y,所以 y = a − ( p − x ) y=a-(p-x) y=a(px),只要( 0 ≤ y ≤ q 0\\leq y \\leq q 0yq),这就是一种合法的两者比赛的结果策略。 k k k的值就是 x + y x+y x+y
同理,如果 B o r y s Borys Borys先手发球,枚举 B o r y s Borys Borys先手发球的失球个数 y y y(也就是后手赢球)从 1 1 1 p p p,因为有 b = ( p − y ) + x b=(p-y)+x b=(py)+x,所以 x = b − ( p − y ) x=b-(p-y) x=b(py),只要( 0 ≤ x ≤ q 0\\leq x \\leq q 0xq),这就是一种合法的两者比赛的结果策略。 k k k的值就是 x + y x+y x+y
计算上述有多少个 k k k的值。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;

int main()

    int t;scanf("%d",&t);
    while(t--)
        int a,b;
        scanf("%d %d",&a,&b);
        int p=a+b+1>>1,q=a+b>>1;//先手发球的次数和后手发球的次数
        set<int>ans;
        for(int i=0;i<=p;i++)//枚举alice先手时,每一种状态
            int x=i,y=a-(p-x);//x是alice先手输球也就是break,y是Borys先手输球
            if(y>=0&&y<=q)ans.insert(x+y);
        
        for(int i=0;i<=p;i++)//枚举Broys先手输球
            int y=i,x=b-(p-y);
            if(x>=0&&x<=q)ans.insert(x+y);
        
        printf("%d\\n",ans.size());
        for(auto x:ans)printf("%d ",x);
        printf("\\n");
    
    return 0;

C. Deep Down Below

题目链接

题意: 玩家控制一个英雄,英雄有一个力量值。英雄要进入n个洞穴,洞穴i有k_i个怪物 a i , 1 , a i , 2 , . . . a i , k a_i,1,a_i,2,...a_i,k ai,1,ai,2,...ai,k,只要进入了一个洞穴,就必须按照顺序一一打败他们。英雄能够打败他们只有英雄的力量值严格大于怪物的护甲值,如果打不过则游戏失败。英雄每打败一个怪物,英雄的力量值+1。求最小的护甲值,使得英雄可以按照一定顺序进入洞穴,并打败所有怪物。

分析: 贪心。首先,我们需要确定进入一个洞穴时,英雄最低需要多少的力量值。
因为英雄每打败一个怪物,英雄的护甲值 + 1 +1 +1。假设进入第一个洞穴英雄的力量值为 x x x,那么打完洞穴的第一个怪物,英雄的力量值变成 x + 1 x+1 x+1,打完第二个怪物变成 x + 2 x+2 x+2。所以只要保证对于第i个怪物的护甲值 y i y_i yi x + i − 1 > y i x+i-1>y_i x+i1>yi

以上是关于Codeforces Round #740 Div. 2 A B C D1 D2的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #740 Div. 2 A B C D1 D2

Codeforces Round #740 (Div. 2) D1. Up the Strip (simplified version)

Codeforces Round #740 (Div. 2) D1. Up the Strip (simplified version)

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))ABCD1D2E题解

Codeforces Round #740 (Div. 2, based on VK Cup 2021 - Final (Engine))ABCD1D2E题解