更好的阅读体验
\color{red}{更好的阅读体验}
更好的阅读体验
A. Difference Operations
原题链接
Origional Link
思想
- 若
a
i
(
i
>
=
2
)
a_i(i>=2)
ai?(i>=2)可以通过
a
i
=
a
i
?
a
i
?
1
a_i=a_i-a_{i-1}
ai?=ai??ai?1?变为
0
0
0
- 说明:
a
i
?
1
∣
a
i
a_{i-1}|a_i
ai?1?∣ai?
- 若
a
i
?
1
(
i
>
=
2
)
a_{i-1}(i>=2)
ai?1?(i>=2)可以通过
a
i
?
1
=
a
i
?
1
?
a
i
?
2
a_{i-1}=a_{i-1}-a_{i-2}
ai?1?=ai?1??ai?2?变为
0
0
0
- 说明:
a
i
2
∣
a
i
?
1
a_{i_2}|a_{i-1}
ai2??∣ai?1?
- 由此可得,当
a
i
(
i
>
=
2
)
a_i(i>=2)
ai?(i>=2)可以变为
0
0
0时
- 说明:
a
1
∣
a
i
a_1|a_i
a1?∣ai?
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 3;
int a[N];
void solve(){
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++){
cin >> a[i];
}
bool flag = 1;
int t = a[1];
for(int i = 2 ; i <= n ; i++){
if(a[i] % t != 0){
flag = 0;
break;
}
}
if(flag) cout << "YES" << "\n";
else cout << "NO" << "\n";
}
int main(){
int tt;
cin >> tt;
while(tt -- ){
solve();
}
return 0;
}
B. Difference of GCDs
原题链接
Origional Link
思想
- 要求
g
c
d
(
i
,
a
i
)
gcd(i,a_i)
gcd(i,ai?)所构成的序列里,
g
c
d
(
i
,
a
i
)
gcd(i,a_i)
gcd(i,ai?)均不同
- 说明
g
c
d
(
i
,
a
i
)
=
i
gcd(i,a_i)=i
gcd(i,ai?)=i,即
i
∣
a
i
i|a_i
i∣ai?
- 故需要在区间
[
l
,
r
]
[l,r]
[l,r]中寻找
i
i
i的倍数
- 对于
a
i
a_i
ai?,若
l
?
a
i
=
?
r
i
?
×
i
?
r
l\leqslant a_i=\lfloor \frac{r}{i}\rfloor\times i\leqslant r
l?ai?=?ir??×i?r,则满足条件
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 3;
int a[N];
void solve(){
int n, l, r;
cin >> n >> l >> r;
bool flag = 1;
for(int i = 1; i <= n; i++){
a[i] = r / i * i;
if(a[i] < l ){
flag = 0;
break;
}
}
if(flag){
cout << "YES" << "\n";
for(int i = 1; i <= n; i++) cout << a[i] << " ";
cout << "\n";
}
else cout << "NO" << "\n";
}
int main(){
int tt;
cin >> tt;
while(tt--){
solve();
}
return 0;
}
C. Doremy’s IQ
原题链接
Origional Link
思想
- 逆向贪心
- 从最后一天考虑,设智商上限为
Q
Q
Q,最后一天的智商为
q
i
=
0
q_i=0
qi?=0
- 若
a
i
?
q
i
a_i \leqslant q_i
ai??qi?,则第
i
i
i天的比赛需要打
- 若
a
i
>
q
i
a_i \gt q_i
ai?>qi?,且
q
i
<
Q
q_i<Q
qi?<Q时,若第
i
i
i天打比赛,则
q
i
=
q
i
+
1
q_i=q_i+1
qi?=qi?+1
- 由于
a
i
>
q
i
a_i>q_i
ai?>qi?的比赛最多打
Q
Q
Q次,对于前面的比赛要继续打,需要
q
i
q_i
qi?尽可能的大
- 故
a
i
>
q
i
a_i \gt q_i
ai?>qi?,且
q
i
<
Q
q_i<Q
qi?<Q时,该第
i
i
i天的比赛必须打,
q
i
=
q
i
+
1
q_i=q_i+1
qi?=qi?+1
- 若
a
i
>
q
i
a_i>q_i
ai?>qi?,且
q
i
=
Q
q_i=Q
qi?=Q时,第
i
i
i天的比赛不能打
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 3;
int a[N];
void solve(){
int n,m;
cin >> n >> m;
string s(n,'0');
for(int i = 0; i < n; i++) cin >> a[i];
int q=0;
for(int i = n-1; i >= 0; i--){
if(a[i] <= q) s[i] = '1';
else if(a[i] > q && q < m){
q++;
s[i] = '1';
}
}
cout << s << "\n";
}
int main(){
int tt;
cin >> tt;
while(tt--){
solve();
}
return 0;
}
后记
- 这天比赛脑子有点抽风
-
A
A
A和
B
B
B居然都是数学证明的类型,考虑麻烦了,把自己陷了进去
- 赛后补题发现
A
A
A和
B
B
B原来这么简单,还是自己数学基础不好,吃大亏QAQ
-
C
C
C题一眼
DP ,赛时考虑了贪心,但是没证出来,逆向贪心的问题不知道怎么处理 - 希望早日变绿。。。。。。(我好笨比)
|