1. 程式人生 > 其它 >acwing 周賽(11)

acwing 周賽(11)

Problem 1

原題連結

Description

有三個正整數 a,b,c,我們不知道每個數的具體值,但我們知道 a≤b≤c。

現在,以隨機順序給出 a+b,a+c,b+c,a+b+c 的值,請你求出 a,b,c 的值。

Input

共一行,包含四個整數 x1,x2,x3,x4,表示以隨機順序給出的 a+b,a+c,b+c,a+b+c 的值。

Output

共一行,三個空格隔開的整數 a,b,c。

Solution

直接建立一個長度為4的陣列x[4],對x陣列排序,X[3]即為a+b+c的值,a = X[3] - X[2]、b = X[3] - X[1]、c = X[3] - X[0].

code

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    int x[4];
    cin >> x[0] >> x[1] >> x[2] >> x[3];
    
    sort(x, x + 4);
    
    cout << x[3] - x[2] << " " << x[3] - x[1] << " " << x[3] - x[0] << endl;
    
    return 0;
}

Problem 2

原題連結

Description

給定一個不含前導 0 的正整數 \(n\)

你可以對 \(n\) 進行刪位操作。

每次操作,可以將 \(n\) 的任意一位數字刪去,但是需要保證每次操作完成後的數字仍然是不含前導 0 的正整數。

如果想要使得 \(n\) 可以成為某個正整數的平方,那麼最少需要對 \(n\) 進行多少次操作?

Input

第一行包含整數 \(T\),表示共有 \(T\) 組測試資料。

每組資料佔一行,包含一個整數 \(n\)

Output

每組資料輸出一行結果,表示最少需要的操作次數,如果不可能使 \(n\) 變為某個正整數的平方,則輸出 −1。

Data range

\(1≤T≤10,1≤n≤2×10^9\)

Solution

由於最大為\(10^9\),通過位運算,所以最多要模擬\(2^{10} = 1024\),對這1024種情況進行暴力求解,當第j位為1時,則選取第j位的數字,在判斷是否是平方數就行了。

code

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

int main()
{
    int T;
    cin >> T;
    
    while(T --)
    {
        string str;
        cin >> str;
        
        int n = str.size();
        int res = 100;//取一個比較大的數
        for(int i = 0; i < 1 << n; i ++)
        {
            int x = 0;
            for(int j = 0; j < n; j ++)
                if(i >> j & 1)
                    x = x * 10 + str[j] - '0';
                
            int t = sqrt(x);
            
            if(x && t * t == x) res = min(res, n - (int)to_string(x).size());
        }
        
        if(res == 100) cout << "-1" << endl;
        else cout << res << endl;
        
    }
    
    return 0;
}

Problem 3

原題連結
還不會,明天補上

這次周賽就做出來一題,wu~~,第一題打卡題,比較簡單;第二題沒有什麼思路;第三題看見題目就怕了。 慢慢加油吧!