题目大意:给你
n
n
n个数,
a
1
,
a
2
.
.
.
a
n
a_1,a_2...a_n
a1,a2...an,要求每次从头或尾删除一个数,直到把
n
n
n个数中的最大值和最小值取完,求最少次数。
分析:
我们可以很轻松地利用快排知道
a
m
a
x
,
a
m
i
n
a_{max},a_{min}
amax,amin的位置,那么其实就变成了删掉
a
m
a
x
,
a
m
i
n
a_{max},a_{min}
amax,amin这两个位置,那么其实与他们的数值无关,于是我们设
a
m
i
n
a_{min}
amin的位置在
x
x
x,
a
m
a
x
a_{max}
amax的位置在
y
y
y。
于是我们就可以假设这个数列为
S
1
x
S
2
y
S
3
S_1xS_2yS_3
S1xS2yS3(
S
1
,
S
,
2
,
S
3
为
字
符
串
S_1,S_,2,S_3为字符串
S1,S,2,S3为字符串),那么就只有三种删法了①删掉
S
1
,
S
2
S_1,S_2
S1,S2②删掉
S
1
,
S
3
S_1,S_3
S1,S3③删掉
S
2
,
S
3
S_2,S_3
S2,S3,只要比较
S
1
+
S
2
,
S
1
+
S
3
,
S
2
+
S
3
S_1+S_2,S_1+S_3,S_2+S_3
S1+S2,S1+S3,S2+S3的大小,取最小值即可
我们有知道
x
,
y
x,y
x,y的位置和字符串的总长,可轻松求出
S
1
.
l
e
n
g
t
h
(
)
=
x
−
1
,
S
2
.
l
e
n
g
t
h
(
)
=
y
−
x
−
1
,
S
3
.
l
e
n
g
t
h
(
)
=
n
−
y
S_1.length()=x-1,S_2.length()=y-x-1,S_3.length()=n-y
S1.length()=x−1,S2.length()=y−x−1,S3.length()=n−y
题目大意:给出
n
n
n个数,以及
l
,
r
l,r
l,r,寻找两个
a
i
,
a
j
a_i,a_j
ai,aj,使得
l
⩽
a
i
+
a
j
⩽
r
l \leqslant a_i+a_j \leqslant r
l⩽ai+aj⩽r(
i
,
j
与
j
,
i
算
一
种
i,j与j,i算一种
i,j与j,i算一种)
分析:
看到寻找一个值在一个范围里面,容易想到将
a
1
,
a
2
.
.
.
a
n
a_1,a_2...a_n
a1,a2...an排序,使得它们有单调性
于是我们就可以从
i
+
1
i+1
i+1~
n
n
n中寻找符合条件的,但是时间不允许,因为是在一个有这单调性的区间里寻找符合条件的,于是我们就想到了二分,吧
l
,
r
l,r
l,r分成两个来做,
s
t
st
st表示
a
i
+
a
s
t
⩾
l
a_i+a_st \geqslant l
ai+ast⩾l且
s
t
st
st是最小的,
e
d
ed
ed表示
a
i
+
a
s
t
⩽
r
a_i+a_st \leqslant r
ai+ast⩽r且
e
d
ed
ed是最大的,由单调性可以知道答案就为
∑
i
=
1
n
−
1
e
d
−
s
t
+
1
\sum_{i=1}^{n-1}ed-st+1
∑i=1n−1ed−st+1
题目大意:给出
a
,
b
a,b
a,b,每次可以将
a
/
c
a/c
a/c或者
b
/
c
b/c
b/c(
c
m
o
d
a
=
0
或
c
m
o
d
b
=
0
c \bmod a=0 或 c \bmod b=0
cmoda=0或cmodb=0而且
c
>
1
c>1
c>1),问能否操作
k
k
k次,使得
a
=
b
a=b
a=b(不能多,也不能少,只能是
k
k
k次)
分析:
明显可以感觉出来,当
k
⩾
2
k \geqslant 2
k⩾2时,肯定都是可以变成的,但关键在于能不能变
k
k
k次,应为是整除,所以每次都至少要除以一个
a
或
b
a或b
a或b的质因数吧,所以说利用分解质因数得到
a
a
a的质因数个数
x
x
x,同理得到
b
b
b的质因数个数
y
y
y,如果
k
⩽
x
+
y
k \leqslant x+y
k⩽x+y就是可行的,否则不可以
那么关于
k
=
1
k=1
k=1的情况,其实只要
a
,
b
a,b
a,b不是倍数关系,就不行,没了。。。😀
题目大意:设
a
:
=
h
a
h
a
h
a := hahah
a:=hahah为令
a
a
a这个字符串的值变为
h
a
h
a
h
hahah
hahah,
a
=
b
+
c
a = b + c
a=b+c为
a
a
a的值为
b
b
b与
c
c
c拼接在一起,问最后一次操作的
a
a
a中,有多少个
h
a
h
a
haha
haha
分析:傻题,利用
m
a
p
,
s
t
r
i
n
g
map,string
map,string做即可
题目大意:问从
a
a
a~
b
b
b,每次操作将
a
+
1
a+1
a+1,直到
a
=
b
a=b
a=b,问总共的数字变化次数
分析:
设
s
u
m
a
suma
suma为从
0
0
0~
a
a
a的变化次数,
s
u
m
b
sumb
sumb同理,则明显的,答案就为
s
u
m
b
−
s
u
m
a
sumb-suma
sumb−suma
我们发现从
0
0
0~
a
a
a,每增加
1
1
1个位变一次,每增加
10
10
10十位变一次,每增加
100
100
100百位变一次……所以我们就知道
s
u
m
a
=
∑
i
=
1
log
10
a
a
/
1
0
i
suma=\sum_{i=1}^{\log_{10}a}a/10^i
suma=∑i=1log10aa/10i
代码实现:
#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define int long longusingnamespace std;voidread(int&sum){
sum=0;char last='w',ch=getchar();while(ch<'0'|| ch>'9') last=ch,ch=getchar();while(ch>='0'&& ch<='9') sum=sum*10+ch-'0',ch=getchar();if(last=='-') sum=-sum;}int t,a,b;signedmain(){// freopen("M.in","r",stdin);// freopen("M.out","w",stdout);read(t);while(t--){int suma,sumb;suma=sumb=0;read(a),read(b);while(a>0) suma+=a,a/=10;while(b>0) sumb+=b,b/=10;printf("%lld\n",sumb-suma);}// fclose(stdin);fclose(stdout);return0;}
题目大意:有两个数
x
,
y
x,y
x,y,每次将
x
−
a
,
y
−
b
x-a,y-b
x−a,y−b或
x
−
b
,
y
−
a
x-b,y-a
x−b,y−a,问最多能减多少次
分析:
设
x
−
a
,
y
−
b
x-a,y-b
x−a,y−b有
q
q
q次,
x
−
b
,
y
−
a
x-b,y-a
x−b,y−a有
p
p
p次,根据题目有
{
q
∗
a
+
p
∗
b
≤
x
q
∗
b
+
p
∗
a
≤
y
\begin{cases} q*a+p*b \leq x\\ q*b+p*a \leq y\\ \end{cases}
{q∗a+p∗b≤xq∗b+p∗a≤y两式相加
q
∗
(
a
+
b
)
+
p
∗
(
a
+
b
)
≤
x
+
y
q*(a+b)+p*(a+b) \leq x+y
q∗(a+b)+p∗(a+b)≤x+y
q
+
p
≤
a
+
b
x
+
y
q+p \leq \frac{a+b}{x+y}
q+p≤x+ya+b那我们回过头来看看
q
,
p
q,p
q,p的定义,就知道
q
+
p
q+p
q+p就是我们要求的答案了
但是它不一定能取到最大值,根据
q
+
p
q+p
q+p有单调性,我们可以想到用二分,但怎么判断它可以成立呢,这里先令
a
≥
b
a \geq b
a≥b,则
m
i
d
=
(
l
+
r
)
/
2
mid=(l+r)/2
mid=(l+r)/2,所以
p
=
m
i
d
−
q
p=mid-q
p=mid−q,将上个不等式组带入
{
q
∗
a
+
(
m
i
d
−
q
)
∗
b
≤
x
q
∗
b
+
(
m
i
d
−
q
)
∗
a
≤
y
\begin{cases} q*a+(mid-q)*b \leq x\\ q*b+(mid-q)*a \leq y\\ \end{cases}
{q∗a+(mid−q)∗b≤xq∗b+(mid−q)∗a≤y
{
q
∗
(
a
−
b
)
≤
x
−
b
∗
m
i
d
q
∗
(
b
−
a
)
≤
y
−
a
∗
m
i
d
\begin{cases} q*(a-b) \leq x-b*mid \\ q*(b-a) \leq y-a*mid \end{cases}
{q∗(a−b)≤x−b∗midq∗(b−a)≤y−a∗mid
{
q
≤
x
−
b
∗
m
i
d
a
−
b
q
≥
y
−
a
∗
m
i
d
b
−
a
\begin{cases} q \leq \frac{x-b*mid}{a-b} \\ q \geq \frac{y-a*mid}{b-a} \end{cases}
{q≤a−bx−b∗midq≥b−ay−a∗mid于是就变成了找是否存在自然数
q
q
q,满足上面的不等式,二分判断即可。