Codeforces Round #467 (Div. 2) BC

31 篇文章 1 订阅
14 篇文章 0 订阅

题目链接

B题 解题思路:


输入 p , y , 然后求 p + 1 — y的范围内,不是 1 — p 的倍数的最大数。

不是1 — p 的倍数,我们利用求素数的方法对其求值(sqrt),由于规律:1e9中相邻素数的差值不超过300(看大佬写的,有兴趣的朋友可以查下),因此可以进行暴力循环,从y 一直到 p + 1,处理好判断条件即可。


代码:


#include <cmath>
#include <cstring>
#include <iostream>

using namespace std;

int p , y;

bool isPrime(int x){  // 判断是否符合不存在被除数
    for (int i = 2 ; i <= sqrt(x) && i <= p; i++){  // 记住i <= p 这个条件 
        if ( x % i == 0){
            return false;
        }
    }    
    return true;
}

int main(){
    scanf("%d%d",&p,&y);
    for (int i = y ;  i > p; i --){  // 从y 到 p + 1
        if (isPrime(i)){  //判断是否符合
            printf("%d\n",i);
            return 0;
        }
    }
    puts("-1");
    return 0;
}



题目链接

C题 解题思路:


给予3个数值 k ,d ,t (注意数据范围 1e18),k是开火顿的时长,d是人间隔多少次去观察一次(如果熄火就打开),一共需要 t 分钟,开火相当于1 分钟,关火一分钟相当于 0.5 分钟,求多少分钟可以炖好。
我们可以将t变为 2 * t ,这样k 时间段内消耗 2 ,熄火的时间段消耗 1 。这个题关键是找到周期,当 k < d 时候,周期肯定为 d, 当 k > d时候,我们的周期就为:

if (k > d){  // 计算一次周期所需要的时间
        ll n = k / d;
        if (k % d) n ++;
        d = n * d;
    }

然后根据一次周期所消耗的数值进行计算。


代码:


#include <cmath>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long ll;

int main(){
    ll d ,k ,t;
    scanf("%lld%lld%lld",&k,&d,&t);
    if (k > d){  // 计算一次周期所需要的时间
        ll n = k / d;
        if (k % d) n ++;
        d = n * d;
    }
    t *= 2;
    ll num = k * 2 + (d - k); // 每次消耗的数量
    double res = t / num * d;
    ll tt = t % num;
    if (tt <= 2 *k){
        if (tt % 2)  //如果是奇数,相当于用半分钟就可以炖好
            res += tt / 2 + 0.5;
        else
            res += tt / 2;
    }
    else{
        res += k + (tt - 2 * k);
    }
    printf("%.1f\n",res);
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值