Educational Codeforces Round 74 (Rated for Div. 2)

A - Prime Subtraction

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <list>
#include <map>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxN = 100 + 5 ;
const int maxM = 2e5 + 5;
 
ll x, y, dif;
 
int main()
{
    int t; scanf("%d", &t);
    while(t -- )
    {
        scanf("%lld%lld", &x, &y);
        dif = x - y;
        if(dif == 1 )
            printf("NO\n");
        else
            printf("YES\n");
    }
    return 0;
}

B - Kill `Em All

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <list>
#include <map>
#define INF 0x3f3f3f3f
#define P(x) x < 0 ? 0 : x
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxN = 1e5 + 5 ;
const int maxM = 2e5 + 5;

int n, r;
int a[maxN];

int main()
{
    int q; scanf("%d", &q);
    while(q -- )
    {
        scanf("%d%d", &n, &r);
        for(int i = 0; i< n ; i ++ )
            scanf("%d", &a[i]);
        sort(a, a + n);
        n = unique(a, a + n) - a;
        int ans = 0;
        for(int i = n - 1; i >= 0 ; i -- )
        {
            if(a[i] - ans * r <= 0)
                continue;
            ans ++;
        }
        printf("%d\n", ans);
    }
    return 0;
}

C - Standard Free2play

题意:

  • 高度为 h 的悬崖,有 n 个台阶是初始状态在外面可以着陆的。我们从第一节台阶(也就是高度为 h 的那个台阶)开始跳,每次跳的高度不能超过 2 。当然我们可以使用水晶改变任何一个高度的台阶状态。
  • 如果我们从高度为 x 的台阶跳, x 这个台阶会消失,并且高度为 x - 1 的这个台阶会改变它的原来状态(如果有,就变成没有;如果没有,就变成有)。
  • 问:到达地面最少使用的水晶数。

思路:

假设我们在 高度为 x 的台阶上往下跳

  1. 如果 x - 1不存在台阶,那么我们就可以直接跳。于是我们跳到了x - 1这个台阶上。
  2. 如果 x - 1存在台阶,那么如果x - 2存在台阶,那么还是可以直接跳。于是我们跳到了x - 2这个台阶上。
  3. 如果 x - 1存在台阶,但是x - 2不存在台阶,那么这个时候我们就必须使用水晶改变 x - 2的状态,使这个高度出现台阶。于是我们跳到了x - 2这个台阶上,并且使用了一颗水晶。

所以我们只需要这样做:

  1. 遍历一遍初始状态下的台阶。 每两个台阶中间的高度是不存在台阶的,所以就是上述所说的情况1,可以直接跳不管。
  2. 我们最开始一定会顺利地跳到:第二个台阶的上面一个高度的那个不存在的台阶,设为tmp。且这时我们跑到的第 i 个台阶, 也就是tmp - 1,是一定存在的。
  3. 从tmp开始考虑上述的情况2和情况3
  4. 如果是情况2,那么我们就直接跳到了x - 2这个台阶上,所以x - 2这个台阶就变为了悬崖顶的第一个台阶,再找它下面那个台阶(为第i + 2个台阶)的上面一个高度的不存在的台阶,接着考虑情况2,3
  5. 如果是情况3,那么我们就是跳到了用水晶改变得来的这个x - 2台阶,所以x - 2这个台阶就变为了悬崖顶的第一个台阶,再找它下面那个台阶(为第 i + 1个台阶)的上面一个高度的不存在的台阶,接着考虑情况2,3

注意:

  • 因为高度有1e9,所以不能用数组判断情况2、3的时候不能直接用标记数组,会RE,可以用set,然后用find()函数判断是不是存在

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <set>
#include <stack>
#include <list>
#include <map>
#define INF 0x3f3f3f3f
#define P(x) x < 0 ? 0 : x
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxN = 2e5 + 5 ;
const int maxM = 2e5 + 5;

int h, n;
int a[maxN] ;
int main()
{
    int q; scanf("%d", &q);
    while(q -- )
    {
        scanf("%d%d", &h, &n);
        set<int>st;
        for(int i = 0; i < n ; i ++ )
        {
            scanf("%d", &a[i]);
            st.insert(a[i]);
        }
        a[n] = 0;
        st.insert(a[n]);
        int ans = 0;
        for(int i = 1; i < n ;  )
        {
            int tmp = a[i] + 1;//第二个台阶的上一节不存在的台阶
            if(st.find(tmp - 2) != st.end())
                i += 2;
            else
            {
                i ++ ;
                ans ++ ;
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值