Codeforces Round #764 (Div. 3)(A ~ D)(思维 + 简单数学 + 字符串)

'只要坚持就会成功--2022.2.18'

A. Plus One on the Subset (签到)

题意: 大概意思就是给你几个数, 给你一个操作: 将你想要的任意个数增加1, 问你多少个操作之后, 这些数变成相等的几个数.

思路: 大小也算个思维题吧, 找出最大值以及最小值相减即可, 得到的数即为答案.

题目链接:

 A. Plus One on the Subset

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
int t;
int main()
{
    cin >> t;
    while(t --)
    {
 
        int n;
        cin >> n;
        int minn = 1000000010, maxn = 0;
        while(n --)
        {
            int x;
            cin >> x;
            minn = min(x, minn);
            maxn = max(x, maxn);
        }
         cout << maxn - minn <<endl;
    }
 
    return 0;
}

 B. Make AP(签到)

题意: 给你三个数, 顺序固定, 问你是否可以让其中一个数乘以一个正整数后, 构成等差数列.

思路: 分情况讨论, 等差数列性质: a + c = 2 * b, 所以可以分成a + c >= 2 * b, 以及a + c < 2 * b的情况, 详细见代码.

题目链接:  

B. Make AP 

AC代码:

#include<iostream>
#include<cstring>
#include<algorithm>
 
using namespace std;
 
int t;
int main()
{
    cin >> t;
    while(t --)
    {
        int a, b, c;
        cin >> a >> b >> c;
        if((a + c) >= b * 2)
        {
            if((a + c) % 2 == 1)//a + c >= 2 * b当a+c之和为奇数时, 一定找不到符合条件的b, 
因为2 * b一定是个偶数; 
            {
                cout << "NO" <<endl;
            }
            else if(((a + c) / 2) % b == 0)
            {
                cout << "YES" << endl;
            }
            else
            {
                cout << "NO" << endl;
            }
        }
        else
        {
            if((b * 2 - a) % c == 0 || (b * 2 - c) % a == 0)
            {
                cout << "YES" << endl;
            }
            else
            {
                cout << "NO" << endl;
            }
        }
    }
 
    return 0;
}

 C. Division by Two and Permutation(思维)

题意: 给你n个数, 将其中的每一个数数除以任意次2(可以不操作), 看是否可以将这些数最终变成1到n连续的整数.

思路: 从大到小(举个例子, 比如如果一个数除以2可以得到16那么一定可以得到2, 而反之则不可)得到n, n - 1, n - 2.....最终查看是否将这些数变成了0, 若有变成0的数, 则这个数没有对结果做出贡献, 从而不能得到从1到n连续的数, 详细见代码

题目链接:  

C. Division by Two and Permutation 

AC代码: 

#include<bits/stdc++.h>
 
using namespace std;
 
int t, n, a[55], x;
 
int main()
{
    cin >> t;
    while(t --)
    {
        for(int i = 0; i <= 54; i ++)a[i] = 0;
        cin >> n;
        for(int i = 1; i <= n; i ++)
        {
           cin >> x;
           while(x > n)x /= 2;
           while(a[x] && x > 0) x/= 2;
           a[x] = 1;
        }
 
        if(a[0]) puts("NO");
        else puts("YES");
    }
 
    return 0;
}

 D. Palindromes Coloring

题意: 给你一个由小写字母组成的字符串, 用n个颜色给字母染色, 染同样颜色的字母可以互换, 一个颜色的字母拿出来构成一个回文字符串, 问最短字符串的最大长度时多少.

思路: 找出有多少对相同字母, 然后除以总颜色个数, 因为找的时最短字符串的最大长度, 所以要平均来算, 看是否可以平均到最短字符串上边, 然后再找出成对相同字母剩下的部分以及单个的字母, 看是否数量可以超过总颜色数, 从而看是否可以平均每个都添加, 从而最短回文字符串字母数也可以加1.

详细看代码

题目链接: 

 D. Palindromes Coloring

AC代码:

#include<bits/stdc++.h>
 
using namespace std;
 
int main()
{
    int t, k, o, e, n;
    string s;
 
    cin >>t;
    while(t --)
    {
        cin >> n >> k;
 
        int c[26] = {0};
        cin >> s;
 
        for(auto i : s) c[i - 'a'] ++;
        e = 0, o = 0;
        for(int i = 0; i < 26; i ++) e += c[i] / 2, o += c[i] % 2;
 
        n = e / k * 2;
        cout << (!n?1:(n + (e % k * 2 + o >= k))) << '\n';
    }
    return 0;
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值