Codeforces Round #636 (Div. 3)部分题解

链接:Codeforces Round #636 (Div. 3)
A - Candies
题意:求出一个x满足x+2∗x+4∗x+⋯+2k−1∗x=n且k>1
思路:提出x得x∗(1+2+4+⋯+2k−1)=n,从小到大枚举k,直到满足n∣(1+2+4+⋯+2k−1)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

int T, n;

int main()
{
   
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    scanf("%d", &T);
    while (T--) {
   
        scanf("%d", &n);
        int now = 3, t = 4;
        while (0 != n % now) {
   
            now += t;
            t *= 2;
        }
        printf("%d\n", n / now);
    }
    return 0;
}

B - Balanced Array
题意:给你一个偶数n,要求你构造出一个数列,满足前n2个数为偶数,后n2个数为奇数,每个数都为互不相同的正整数,且前n2个数的和等于后n2个数的和
思路:奇数和偶数的差为奇数,如果n2−1为奇数,那么对于前n2−1对奇数和偶数,合起来的差为偶数,那么第n2对奇数和偶数就无法构造出来,所以n2必须为偶数,即n∣4,显然可以构造出这样的数列2 4 6⋯n 1 3 5⋯(n−3) (n+n2−1)

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

int T, n;

int main()
{
   
    // freopen("in.txt", "r", stdin);
    // freopen("out.txt", "w", stdout);
    scanf("%d", &T);
    while (T--) {
   
        scanf("%d", &n);
        if (n % 4) {
   
            printf("NO\n");
            continue;
        }
        printf("YES\n");
        for (int i = 1; i <= n / 2; i++) printf("%d ", 2 * i);
        for (int i = 1; i <= n / 2 - 1; i++) printf("%d ", 2 * i - 1);
        printf("%d\n", n + n / 2 - 1);
    }
    return 0;
}

C - Alternating Subsequence
题意:就是给你n个数,你需要找出其中的最长子序列,并且这个子序列是正负交替的,并且尽量让这个子序列的和最大
思路:由于要子序列最长,所以把n个数按照正负分成几块(块内元素正负性相同),然后再在每个块内贪心取一个数即可

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace st
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值