Codeforces Round 636 (Div. 3)

日常三题选手…

A. Candies

题目描述

给定一个整数 $n$,$k$ 为大于 $1$ 的任意整数,求解方程 $x + 2x + 4x + \dots + 2^{k-1} x = n$。

解法

可以计算得出实质上在求 $(2^{k}-1)x=n$,枚举一下 $2^k-1$,对于 $n \mid 2^k-1$,输出 $x=\dfrac{n}{2^k-1}$。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int _,n;
ll idx[10005];
int main() {
idx[1]=1;
for(int i=2;i<=63;i++) idx[i]=pow(2,i)-1;
for(scanf("%d",&_);_;_--) {
scanf("%d",&n);
for(int i=2;i<=63;i++) {
if(n%idx[i]==0) {
printf("%d\n",n/idx[i]);
break;
}
}
}
return 0;
}

B. Balanced Array

题目描述

给定一个正整数 $n(n \mid 2)$,构造一个长度为 $n$ 的数组 $a$ 使得 $a$ 的前半部分之和与后半部分之和相等,同时 $a$ 的前半部分都是偶数,后半部分都是奇数,$a$ 中每一个数都不相等。

解法

首先思考最小的部分(常用套路),发现 $n=2$ 一定无解,$n=4$ 一定有解。观察样例提示可以发现对于任意 $n \mid 4$ 都是有解的,其他则一定无解。构造方式也比较套路,对于 $1 \sim \dfrac{n}{2}$,$ai = 2^i$,对于 $\dfrac{n}{2}+1 \sim n$ , $a_i=a { i - \frac{n}{2} } - 1$ ,再对最后一个数处理一下 $a_n \gets a_n+\dfrac{n}{2}$,就成功的构造出来了。

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
#include <bits/stdc++.h>
using namespace std;
int _,a[200005],n;
int main() {
for(scanf("%d",&_);_;_--) {
scanf("%d",&n);
if(n%4!=0) puts("NO");
else {
puts("YES");
int idx=0;
for(int i=2;i<=n;i+=2) {
a[++idx]=i;
}
for(int i=1;i<=n/2-1;i++) {
idx++;
a[idx]=a[idx-n/2]-1;
}
idx++;
a[idx]=a[idx-n/2]+n/2-1;
for(int i=1;i<=n;i++) printf("%d ",a[i]);
printf("\n");
}
}
return 0;
}

C. Alternating Subsequence

题目描述

给定长度为 $n$ 的序列 $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
//https://codeforces.com/contest/1343/problem/C
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int _,n,a[200005];
int main() {
for(scanf("%d",&_);_;_--) {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int i=1,maxx,minx;
ll sum=0;
while(i!=n+1) {
maxx=-0x3f3f3f3f;
minx=-0x3f3f3f3f;
while(a[i]>0&&i!=n+1) {
maxx=max(maxx,a[i]);
i++;
}
if(a[i-1]>0) sum+=maxx;
while(a[i]<0&&i!=n+1) {
minx=max(minx,a[i]);
i++;
}
if(a[i-1]<0) sum+=minx;
}
printf("%lld\n",sum);
}
return 0;
}

D. Constant Palindrome Sum

题目太神仙了,赛后看题解搞出来了,一时半会也不知道怎么做。

文章作者: answerend42
文章链接: http://answerend42.github.io/2020/04/26/cf1343/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 answerend42的Blog