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;
}