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

posted @ 2021-08-10 20:10  CharlesLC  阅读(57)  评论(0编辑  收藏  举报