CSP歷年複賽題-P7071 [CSP-J2020] 優秀的拆分

五月江城發表於2024-06-13

原題連結:https://www.luogu.com.cn/problem/P7071

題意解讀:提取n的二進位制位所有的1表示的整數,如果最低位是1則輸出-1。

解題思路:

如果n的二進位制最低為是1(n是奇數),則肯定不是優秀拆分,輸出-1

否則,從低位到高位遍歷n的每一個二進位制位,看第i位是1,倒序輸出2^i。

100分程式碼:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    stack<int> res;
    int n;
    cin >> n;
    if(n & 1) cout << -1; //二進位制&操作,判斷n最低二進位制位是否為1
    else
    {
        for(int i = 0; i < 32; i++)
        {
            if(n >> i & 1) //判斷n的第i個二進位制位是否為1,最低位是0
            {
                res.push(pow(2, i));
            }
        }
    }
    while(res.size())
    {
        cout << res.top() << " ";
        res.pop();
    }
    return 0;
}

另一種方法,直接列舉2^i方,i從30~1,看n是否夠減,夠減則輸出,n -= 2*i

100分程式碼:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    cin >> n;
    if(n % 2) cout << -1; 
    else
    {
        for(int i = 30; i >= 1; i--)
        {
            int x = pow(2, i);
            if(n >= x)
            {
                cout << x << " ";
                n -= x;
            }
        }
    }
    return 0;
}

相關文章