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~~,第一题打卡题,比较简单;第二题没有什么思路;第三题看见题目就怕了。 慢慢加油吧!