情况

时间:2024年7月25日15:05
这场做的不太正经没认真(2小时a题···)

题解

A

题意

给出一个数组,你可以拆成左右两部分然后交换顺序,问你能否让他单调递增?

思路

环形检测这个数组的递增性,最多一处不递增。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void solve()
{
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
int cnt = 0;
for (int i = 1; i < n; i++)
{
if (a[i] < a[i - 1])
{
if (cnt == 0)
cnt = i;
else
{
cout << "No" << endl;
return;
}
}
}
if (cnt == 0)
{
cout << "Yes" << endl;
return;
}
else
{
for (int j = cnt + 1; j < n; j++)
{
if (a[j] < a[j - 1])
{
cout << "No" << endl;
return;
}
}
if (a[0] < a[n - 1])
{
cout << "No" << endl;
return;
}
for (int i = 1; i < cnt; i++)
{

if (a[i] < a[i - 1])
{
cout << "No" << endl;
return;
}
}
cout << "Yes" << endl;
}
}

问题

刚写想的是划分区间,让后面的区间不在之前的区间内,后来发现想错了只能拆成左右两部分。

B

题意

一个数组是完美的:存在两个下标,每个数组中的数都能被至少其中一个下标的数组值整除

思路

最小的一定是其中一个索引。除完一遍标记能整除的,之后再拿最小的没标记的除,必须得能整除不然死。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void solve()
{
int n;cin >> n;
vector<int> a(n),vis(n,0);

for (int i = 0; i < n;i++){
cin >> a[i];
}
sort(a.begin(), a.end());
int thefirst = 0;
for (int i = 1;i<n;i++){
if(a[i]%a[0]==0)
{
vis[i] = 1;

} else if (thefirst == 0){
thefirst = i;
}
}
for (int i = 1;i<n;i++){
if(vis[i] == 0){
if(a[i]%a[thefirst]!=0){
cout << "No" << endl;
return ;
}
}
}
cout << "Yes" << endl;
}

C

题意

要给一个数组全变成相同数:
你能将L,R之间的数,变成排序后的中位数的值。

思路

n=2 输出小的数
n>=3 输出长度为3的子数组的最大中位数。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void solve()
{
int n;
cin >> n;
int ans = 0;
vector<int> a(n);
for(int i = 0;i < n;i++)
cin >> a[i];
if (n == 2){
ans = min(a[0], a[1]);
cout << ans << endl;

} else
{
int temp[3];
for (int i = 0;i < n-2;i++){
temp[0] = a[i];
temp[1] = a[i + 1];
temp[2] = a[i + 2];
sort (temp, temp + 3);
ans = max(ans, temp[1]);
}
cout << ans << endl;

}

}