acwing 周賽(11)
阿新 • • 發佈:2021-08-10
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~~,第一題打卡題,比較簡單;第二題沒有什麼思路;第三題看見題目就怕了。 慢慢加油吧!