专栏文章
题解:P14257 嫉妒(jealousy)
P14257题解参与者 15已保存评论 15
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 15 条
- 当前快照
- 1 份
- 快照标识符
- @minrsjp8
- 此快照首次捕获于
- 2025/12/02 07:18 3 个月前
- 此快照最后确认于
- 2025/12/02 07:18 3 个月前
tag:模拟。
从 到 枚举 ,判断 与 是否均不等于某个 。若是,则答案为
Yes;若都不是,则答案为 No。每次暴力从 开始枚举 ,到 为止,单次判断 ,总时间复杂度 ,可以轻松通过。
Code:
CPPint n,y,s,t;
inline void solve(){
cin>>n>>y>>s>>t;
int flag=0;
for(int i=1;i<=n;++i){
int flag_0=1,flag_1=1;
for(int j=0;y+j*t<=(i-1)*s;++j)
if(y+j*t==(i-1)*s)
flag_0=0;
for(int j=0;y+j*t<=i*s;++j)
if(y+j*t==i*s)
flag_1=0;
if(flag_0&&flag_1)flag=1;
}if(flag)cout<<"Yes\n";
else cout<<"No\n";
}
Bonus
事实上可以用取模将单次判断优化至 ,具体地,如果存在非负整数 使得 ,则 且 。
只需要实现一个函数 判断以上条件,若找到一个 使得 与 均返回
false,则答案为 Yes,否则答案为 No。时间复杂度优化为 。Code:
CPPint n,y,s,t;
bool check(int x){
return (x*s>=y)&&((x*s-y)%t==0);
}
void solve(){
cin>>n>>y>>s>>t;
int flag=0;
for(int i=1;i<=n;++i)
if(!check(i-1)&&!check(i))
flag=1;
if(flag)cout<<"Yes\n";
else cout<<"No\n";
}
另外此题还有一个性质:将 换为 ,得到的结果相同。
这是因为当 时,如果要使每场面试都被发现,则首先 或存在 ,此时第一场或第二场面试开始时会被发现。对于下一场面试,如果开始时被发现,则一定有 ,否则结束时被发现,则有 。
综合以上情况,可以得到 时,只要答案为
No。则一定 或存在 ,且 。容易验证若这个条件满足,则答案一定为 No,即这是一个等价条件。这个条件与 无关,也就是说 时的答案均和 时相同。时间复杂度优化为 ,将以上代码
for 循环中的 n 改为 min(3,n) 即可。相关推荐
评论
共 15 条评论,欢迎与作者交流。
正在加载评论...