A:猫猫与广告
思路:
让广告纸的较小的边和白纸较小的边比较
让广告纸较大的边和白纸较大的边比较
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int a1=min(a,b);
int b1=max(a,b);
int c1=min(c,d);
int d1=max(c,d);
if(a1<=c1&&b1<=d1) puts("YES");
else puts("NO");
return 0;
}
B:猫猫与密信
思路:
总共有lov,loe,ove,lve这四种可能
暴力判断
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
string s;
cin>>s;
int flag=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='l'&&s[i+1]=='o'&&s[i+2]=='v')
{
flag=1;break;
}
if(s[i]=='l'&&s[i+1]=='o'&&s[i+2]=='e')
{
flag=1;break;
}
if(s[i]=='l'&&s[i+1]=='v'&&s[i+2]=='e')
{
flag=1;break;
}
if(s[i]=='o'&&s[i+1]=='v'&&s[i+2]=='e')
{
flag=1;break;
}
}
if(flag) puts("YES");
else puts("NO");
return 0;
}
C:猫猫与数列
思路:
这道题目要处理溢出问题
a
n
>
1
e
18
an>1e18
an>1e18
其中
a
n
=
a
n
−
2
a
n
−
1
an=a_{n-2}^{an-1}
an=an−2an−1
我们对
a
n
>
1
e
18
an>1e18
an>1e18取log
就是判断
a
n
−
1
∗
a_{n-1}*
an−1∗lg
(
a
n
−
2
)
>
18
(a_{n-2}) > 18
(an−2)>18
如果大于的话就输出n,否则求出
a
n
a_n
an
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef unsigned long long ll;
const int N=100;
const ll INF=1e18;
ll q[N];
ll qmi(ll a,ll k)
{
ll res=1;
while(k)//当k不是0时
{
if(k&1) res=(ll) res*a;//如果k的末尾是1的话
k>>=1;//把k的末尾删掉
a=(ll)a*a;//更新a
}
return res;
}
int main()
{
ll a,b;
cin>>a>>b;
q[1]=a,q[2]=b;
for(int i=3;;i++)
{
if( q[i-1] * log10( q[i-2] ) > 18 )
{
cout<<i-1<<endl;
break;
}
else q[i] = qmi( q[i-2],q[i-1] );
}
// q[3]=qmi(q[3-2],q[3-1]);
// q[4]=qmi(q[4-2],q[4-1]);
// q[5]=qmi(q[3],q[4]);
//
// if(q[5]*log10(q[3])>18) puts("YES");
// cout<<q[3]<<endl;
// cout<<q[4]<<endl;
cout<<INF<<endl;
//
return 0;
}
思路: 离线询问
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
struct node{
int x, y, id;
// bool operator < (const node& A)const{
// if(x != A.x) return x < A.x;
// return y < A.y;
// }
};
int n,m;
int ans[N];
bool cmp(node a,node b)
{
if(a.x!=b.x) return a.x<b.x;
if(a.y!=b.y) return a.y<b.y;
return a.id<b.id;
}
node cats[N],hosts[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) cin>>cats[i].x;
for(int i=1;i<=n;i++) cin>>cats[i].y;
for(int i=1;i<=m;i++) cin>>hosts[i].y;
for(int i=1;i<=m;i++) cin>>hosts[i].x;
for(int i=1;i<=n;i++) cats[i].id=i;
sort(cats+1,cats+n+1,cmp);
sort(hosts+1,hosts+m+1,cmp);
//
// for(int i=1;i<=n;i++)
// {
// cout<<cats[i].x<<" "<<cats[i].y<<" "<<cats[i].id<<endl;
// }
int px=1,max_v=-1;
for(int i=1;i<=n;i++)
{
while(px<=m&&hosts[px].x<=cats[i].x)
{
max_v=max(hosts[px].y,max_v);
px++;
}
if(max_v>=cats[i].y) ans[ cats[i].id ]=max_v;
else ans[cats[i].id]=-1;
}
for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
return 0;
}
思路:更相减损法
g
c
d
(
x
,
y
)
=
g
c
d
(
x
−
y
,
y
)
gcd(x,y) = gcd(x-y,y)
gcd(x,y)=gcd(x−y,y)
gcd(a+c,b+c) = gcd(a-b,a+c) = d
d满足 d>=2
枚举d,同时更新c
//如果两个数的差值为1,则特判输出-1
//如果两个数差值为0,即两个数相等,如果两个数为1,则应该+1,否则才是0
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
ll ans=1e16;
ll a,b;
void check(ll fac)
{
if(fac==1) return;
if(a%fac==0) ans=min(ans,0ll);
else
{
ans = min(ans,fac-a%fac);
}
}
int main()
{
cin>>a>>b;
if(a<b) swap(a,b);
ll d=a-b;
if(d==0)
{
if(a==1) puts("1");
else puts("0");
return 0;
}
else if(d==1)
{
puts("-1");
return 0;
}
int B=sqrt(d)+1;
for(int i=1;i<=B;i++)
{
if(d%i==0)
{
check(i);
check(d/i);
}
}
printf("%lld\n",ans);
return 0;
}