如何解决如何摆脱“超过时间限制”
我尝试解决在线网站中的一些问题。我已经用简单的C ++解决了一个问题,它工作得很好,但是有时会抛出“ 时间限制超出”错误。如何摆脱呢?
这是我解决的问题
这是我的代码。
#include<iostream>
using namespace std;
int main()
{
int t,a,b;
long ans;
cin>>t;
while(t--)
{
cin>>a>>b;
ans=a;
for(int i=a+1; i<=b; i++)
{
ans=ans&i;
}
cout<<ans<<endl;
}
}
解决方法
如果您有两个数字X和Y,则它们由有限的位集表示:
X = Bx(1),...,Bx(n)
和
Y = By(1),By(n)
两者之间的按位与可计算为
X ^ Y = (Bx(1) ^ By(1)),(Bx(n) ^ By(n))
A B A ^ B
0 0 0
0 1 0
1 0 0
1 1 1
我们注意到:
- 所有位都可以单独计算,我们方程式和位一样多
- 在一系列逻辑语句(其中AND是运算符)中,当且仅当任何一项为0时,结果为0
因此,如果任何数字成对,则最后一位为0。否则,最后一位为1。如果任何数字的倒数第二位为0,则该位的结果为0。否则将会是1。
通常,基于Dirichlet提出的pigeonhole principle,如果给定位具有足够的连续(元素),则该位的结果将为0。例如,对于最后一位有两个变体,因此,如果连续集中至少有两个数字,那么最后一位将为0。如果我们取下一位,则您有四个变体:00、01、10和11因此,如果连续集中至少有3个数字,则该位为0;对于下一位,则有8个变体:000、001、010、011、100、101、110、111。您的连续集合中至少有5个数字,那么该位为0。
现在,由于我们有一个简单的规则来确定是否有很多项目,因此大多数位将以超出我上面描述的规则的变化数的位数结束。对于这些位,您可以检查第一个和最后一个数字。如果它们的那个位具有相同的值,那么该值将是结果,是0还是1。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。