情况

时间:2024年7月28日22:35
image.png

题解

A

题意

奇数元素个数的数组。能去掉相邻两个元素,最后剩下最大?

思路

偶数位置必删,找奇数位置的最大值。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void solve()
{
int n;
cin >> n;
vector<int> a(n);
vector<int> b(n);
for (int i = 0; i < n; ++i)
{
cin >> a[i];
if (i % 2 == 0)
b.push_back(a[i]);
}
sort(b.begin(), b.end());
cout << b[b.size() - 1] << endl;
}

B

题意

好数组: bi=ai&ai+1 按位与。
给出b,输出一种a或不存在

思路

我的思路:先找能否有:条件是连续三个数相同位置不能 1 0 1
之后再输出:从后往前,ai+1或等于bi,ai=bi
别人:直接实现。ai = bi | bi-1 ,再检查bi=ai&ai+1,
不行就没有。

代码

fool’s v

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
56
bool hasInvalidPattern(int number1, int number2, int number3)

{
// 用于检查连续三个位是否为1, 0, 1的模式
for (int i = 0; i < 30; ++i)
{ // 假设我们只检查前30位,因为int通常是32位
// 我们检查当前位及其后两位是否匹配模式1, 0, 1
// 使用位掩码提取特定的位
bool bit1 = (number1 >> (i)) & 1; // 第i位
if (bit1 == 0)
{
continue;
}
bool bit2 = (number2 >> (i)) & 1; // 第i+1位
bool bit3 = (number3 >> (i)) & 1; // 第i+2位

if (bit1 == 1 && bit2 == 0 && bit3 == 1)
{
return true; // 发现了无效的模式
}
}
return false; // 没有发现无效的模式
}
void solve()
{
int n;
cin >> n;
vector<int> b(n - 1);
vector<int> ans(n);
for (int i = 0; i < n - 1; i++)
cin >> b[i];
// 0001 0001
// 0010 0011
// 0011 0010
// 0001
for (int i = 0; i < n - 3; i++)
{
if (hasInvalidPattern(b[i], b[i + 1], b[i + 2]))
{
cout << "-1" << endl;
return;
}
}
ans[n - 1] = b[n - 2];

for (int i = n - 2; i >= 0; i--)
{
ans[i + 1] |= b[i];
ans[i] = b[i];

}
//ans[0] &=b[0] ;
for (int i = 0; i < n; i++)
cout << ans[i] << " ";
cout << endl;
}

REN_REN

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
int n, m;

void solve()
{
cin >> n;
vector<int> aa(n + 1), bb(n + 1);
int ans = 0;
for (int i = 1; i <= n - 1; i++)
{
cin >> bb[i];
}
for (int i = 1; i <= n; i++)
{
aa[i] = bb[i] | bb[i - 1];
}
for (int i = 1; i <= n - 1; i++)
{
if ((aa[i] & aa[i + 1]) != bb[i])
{
cout << "-1\n";
return;
}
}
for (int i = 1; i <= n; i++)
{
cout << aa[i] << ' ';
}
cout << '\n';
}

C

题意

数组,给出操作:
选一个数,然后所有元素减去它,取绝对值。
四十次之内完成,要不然就输出-1.不用强求最少次数。

思路

贪心+模拟。每次减去最大值和最小值的均值。
不存在的情况:存在两个数奇偶性不相等。
正解,jiangly直接用2对折,2的30次到1来缩小数的范围,再讨论奇偶。解决

代码

fool

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
void solve()
{
int n;
std::cin >> n;

std::vector<int> a(n);
for (int i = 0; i < n; i++)
{
std::cin >> a[i];
}

for (int i = 1; i < n; i++)
{
if (a[i] % 2 != a[0] % 2)
{
std::cout << -1 << "\n";
return;
}
}

std::cout << 30 + (a[0] % 2 == 0) << "\n";
for (int i = 29; i >= 0; i--)
{
std::cout << (1 << i) << " ";
}
if (a[0] % 2 == 0)
{
std::cout << 1;
}
std::cout << "\n";
}

jiangly

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
void solve()
{
int n;
std::cin >> n;

std::vector<int> a(n);
for (int i = 0; i < n; i++)
{
std::cin >> a[i];
}

for (int i = 1; i < n; i++)
{
if (a[i] % 2 != a[0] % 2)
{
std::cout << -1 << "\n";
return;
}
}

std::cout << 30 + (a[0] % 2 == 0) << "\n";
for (int i = 29; i >= 0; i--)
{
std::cout << (1 << i) << " ";
}
if (a[0] % 2 == 0)
{
std::cout << 1;
}
std::cout << "\n";
}

D

题意

1到n的数,两个数之间按位异或是素数,则有边连接。如何给1-n涂色,一个边不能连相同颜色。

思路

对于n≥6的情况,把1n按mod 4分为4组(分别余14),则同组互相异或都是4的倍数,这些数可以为1种颜色因为没有边,所以至多4种颜色。

代码

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
void solve()
{
int n;
cin >> n;
if (n == 1)
{
cout << 1 << endl;
cout << 1 << endl;
}
else if (n == 2)
{
cout << 2 << endl;
cout << 1 << ' ' << 2 << endl;
}
else if (n == 3)
{
cout << 2 << endl;
cout << 1 << ' ' << 2 << ' ' << 2 << endl;
}
else if (n == 4)
{
cout << 3 << endl;
cout << 1 << ' ' << 2 << ' ' << 2 << ' ' << 3 << endl;
}
else if (n == 5)
{
cout << 3 << endl;
cout << 1 << ' ' << 2 << ' ' << 2 << ' ' << 3 << ' ' << 3 << endl;
}
else if (n == 6)
{
cout << 4 << endl;
cout << 1 << ' ' << 2 << ' ' << 2 << ' ' << 3 << ' ' << 3 << ' ' << 4 << endl;
}
else
{
cout << 4 << endl;
for (int i = 1; i <= n; ++i)
cout << ((i+3) % 4)+1 << ' ';
cout << endl;
}
}

问题

哎,本场最大笑话。wa试答案