Codeforces Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)

解题情况 3of 9 A B C    日期 9.1

目录

A. Increasing and Decreasing

题目分析:

代码:

B. Swap and Reverse

题目分析:

代码:

 C. Divisor Chain


A. Increasing and Decreasing

Codeforces Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)_第1张图片

题目分析:

x->y递增,且每次加的数要比前一次要小,判断一下,从x到y这个区间是否能承载满足这个条件的数,这里我们选择最有可能的情况,也即y-1,(y-1)-2,(y-1-2)-3... 可以转化为(y-x)和 1+2+3+...(n-2)比较,到n-2的原因是去掉了x和y。如果可以的化,就按照这样的形式输出即可,否则输出-1

代码:

#include
using namespace std;
typedef long long ll;
ll sum[1000];
bool isok(int a,int b,int n)
{
    ll sum=0;
    sum+=a;
    for(int i=1;i<=n-2;i++)
    {
        sum+=i;
    }

    if(sum+(n-2)>t;
    
    while(t--)
    {
        int x,y,n;cin>>x>>y>>n;
        isok(x,y,n);
        if(!isok(x,y,n))cout<<"-1"<=1;i--)cout<

B. Swap and Reverse

Codeforces Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)_第2张图片

题目分析:

两种交换方式:

①i和 i+2 交换,也即 奇奇交换,偶偶交换 

② (1)k为奇 也等同于 奇奇交换,偶偶交换 

  (2)k为偶 等同于 奇偶可以交换

所有整体上取决于k的奇偶,若k为奇,则分别在奇数范围内和偶数范围内寻求最优解输出

反之则可以在整个字符串上寻求最优解输出

代码:

#include
using namespace std;
const int N =1e5+7;
char a[N];
char a1[N],a2[N];
bool cmp(char a ,char b)
{
    return a>t;
    while(t--)
    {
        int n,k;cin>>n>>k;
        for(int i=0;i>a[i];
        if(k%2==0)
        {
            sort(a,a+n,cmp);
            for(int i=0;i

 C. Divisor Chain

Codeforces Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2)_第3张图片

题目分析:

从x减到1,每次减的数都必须是当前数的除数,减的数的使用次数不能超过两次

第一反应为判断素数,因为素数只能-1,题目又说,数据保证合法,所以,从这方面考虑,最终发现不太可能实现。

看到了一个大佬使用的位运算之类的方式做的特别简单

分为两步:

1.找到x内的最大二进制位数2^{t}并 把x减到2^{t} 比如 9->2^{^{3}}   20 ->2^{4} 

2.将 2^{t} 减到1 

代码:

#include 

#define all(a) (a).begin(), (a).end()
#define sz(a) (int)(a).size()
#define pb push_back
#define mp make_pair

using namespace std;

typedef long long ll;
typedef long double ld;
typedef pair pii;

bool bit(int mask, int pos) {
    return (mask >> pos) & 1;
}

int main() {

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int tt;
    cin >> tt;
    while (tt--) {
        int x;
        cin >> x;
        int p;
        vector ans;
        ans.pb(x);
        for (int i = 0; ; ++i) {
            if (bit(x, i)) {
                if (x == (1 << i)) {
                    p = i;
                    break;
                }
                x -= (1 << i);
                ans.pb(x);
            }
        }
        while (p > 0) {
            x -= (1 << (p - 1));
            ans.pb(x);
            --p;
        }
        cout << sz(ans) << "\n";
        for (int y : ans) {
            cout << y << " ";
        }
        cout << "\n";
    }

}

你可能感兴趣的:(题解,算法,c++,Codeforces)