【CF】Day1

​​​​​​https://codeforces.com/problemset/problem/2050/B
https://codeforces.com/problemset/problem/2050/C

B. Transfusion

题目:

思路:

我们观察发现,每次操作都只能改变一个数左右两边的数,所以可以知道只能对奇数位or偶数位的数字进行加一减一操作

首先最后要使所有数变成同一个数,那么最后肯定有奇数位的数的和的平均数等于偶数位的和的平均数

其次每次操作都不会使得和改变,所以我们可以大胆操作,那么什么情况下不可以呢?

显然,当奇数or偶数的平均数不是整数时就肯定不行,否则必定可以使得所有数都变成平均数

证明(来自D小姐的数学归纳法):

基例:当数组长度为1时,只有一个元素,它本身就是A,无需任何操作。

归纳假设:假设对于长度为k的数组,可以通过一系列操作将所有元素变成A。

归纳步骤:考虑长度为k+1的数组。

1. 找到第一个不等于A的元素。假设这个元素大于A(小于A的情况类似)。

2. 由于总和不变,必然存在另一个元素小于A。

3. 通过一系列相邻的加减操作,将多余的值从大于A的元素转移到小于A的元素。

4. 重复这个过程,直到所有元素都等于A。

由于每次操作都减少了至少一个元素与A的差距,且总和保持不变,最终所有元素都会变成A。

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define ll long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endl

void solve()
{
    int n;
    cin >> n;
    ll ji = 0, ou = 0;
    ll cntj = 0, cnto = 0;
    for (int i = 1; i <= n; i++)
    {
        ll x;
        cin >> x;
        if (i & 1)
            ji += x,cntj++;
        else
            ou += x,cnto++;
    }
    if ((ji % cntj == 0) && (ou % cnto == 0) && 
        (ji / cntj) == (ou / cnto))
    {
        yes;
    }
    else
    {
        no;
    }
}

int main()
{
    cin.tie(0)->sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

C. Uninteresting Number

题目:

思路:

首先我们要知道,如果一个数能被9整除,那么一定有该数每个位相加之和能被9整除,如342

那我们再看题目,由于x²一定要小于10,那么x只能取0,1,2,3,可以发现0,1对数是没有影响的,那么接下来直接考虑2,3即可,我们如果对3进行平方操作,那么对数位增加3*3-3=6,同理可以计算出2的奉献为2,那么接下来我们只需要枚举3和2是否要平方操作了

我们可以直接暴力枚举,如果增加的奉献最后对9取模刚好等于原数对9取模的值,说明肯定可以实现,因为同余有加减操作,所以直接取模是没问题的

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <memory>
using namespace std;
#define ll long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endl

void solve()
{
    string s;
    cin >> s;
    ll n = 0;
    ll has[2] = { 0,0 };
    for (int i = 0; i < s.length(); i++)
    {
        n += s[i] - '0';
        if (s[i] == '2')
        {
            has[0]++;
        }
        else if (s[i] == '3')
        {
            has[1]++;
        }
    }
    if (n % 9 == 0)
    {
        yes;
        return;
    }
    int need = 9 - n % 9;
    for (int i = 0; i <= has[0]; i++)
    {
        for (int j = 0; j <= has[1]; j++)
        {
            if ((i*2+j*6) % 9 == need)
            {
                yes;
                return;
            }
        }
    }
    no;
}

int main()
{
    cin.tie(0)->sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值