Codeforces Round #698 (Div. 2) BC

B. Nezzar and Lucky Number

题解:

假设一个数可以拆成 k k k d d d的和再加上一个余数, 如果余数与 k k k中若干个 d d d可以组成一个 lucky number,那么说明这个数就是 lucky number

还有一点就是,如果这个数大于10倍的 d d d,说明这个数就一定是 lucky number 。假设 d d d是7,10倍的 d d d就是70,那么这个数就可以拆成若干个7之和再加上70-79之间的任意一个数与余数的和

int a[N], st[10];
int main()
{
 
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
 
    int T; scanf("%d", &T);
    while (T -- )
    {
        int q, d; scanf("%d%d", &q, &d);
        for (int i = 1; i <= q; i ++ ) scanf("%d", &a[i]);
 
        for (int i = 2; i <= 9; i ++ ) st[i] = i * d;
        for (int i = 1; i <= q; i ++ )
        {
            if (a[i] >= 10 * d) puts("YES");
            else if (a[i] % d == 0) puts("YES");
            else
            {
                bool flag = false;
                int c = a[i] / d, y = a[i] % d;
                for (int i = 2; i <= 9; i ++ )
                {
                    if (d - y == st[i] % 10 && i <= c)
                    {
                        puts("YES");
                        flag = true;
                        break;
                    }
                }
                if (!flag) puts("NO");
            }
        }
    }
 
    return 0;
}

C. Nezzar and Symmetric Array

题目大意:

一个数组内有 2 n 2n 2n个不同的元素,且保证每一个 a i ( 1 ≤ i ≤ 2 n ) a_{i}\left ( 1\le i\le2n \right ) ai(1i2n)都有一个对应的 a j ( 1 ≤ j ≤ 2 n ) a_{j}\left ( 1\le j\le2n \right ) aj(1j2n),使得 a i = − a j a_{i}=-a_{j} ai=aj d i = ∑ j = 1 2 n ∣ a i − a j ∣ d_{i}= {\textstyle \sum_{j=1}^{2n}}\left | a_{i}-a_{j} \right | di=j=12naiaj,问是否存在一个数组 a a a使之满足数组 d d d

题解:
通过简单打表可以发现,对于每个 d i d_{i} di n − 1 n-1 n1个贡献度是 2 m a x ( ∣ a i ∣ , ∣ a j ∣ ) 2max(|a_{i}|,|a_{j}|) 2max(ai,aj) ∣ a i ∣ ! = ∣ a j ∣ |a_{i}|!=|a_{j}| ai!=aj.另一个贡献度是 a i a_{i} ai本身

假设数组 a = [ a , b , c , d , − a , − b , − c ] a=[a, b, c, d,-a,-b,-c] a=[a,b,c,d,a,b,c],那么 d 1 = 2 ( ∣ a ∣ + m a x ( ∣ a ∣ , ∣ b ∣ ) + m a x ( ∣ a ∣ , ∣ c ∣ ) ) d_{1}=2(|a|+max(|a|,|b|)+max(|a|,|c|)) d1=2(a+max(a,b)+max(a,c))

如果a是最大的,那么 d 1 = 2 ( ∣ a ∣ + ∣ a ∣ + ∣ a ∣ ) d_{1}=2(|a| + |a| + |a|) d1=2(a+a+a),则 a = d 1 2 ⋅ 3 a=\frac{d_{1}}{2\cdot 3} a=23d1
且如果b是次大的,那么 d 2 = 2 ( ∣ b ∣ + ∣ b ∣ + ∣ a ∣ ) d_{2}=2(|b| + |b| +|a|) d2=2(b+b+a),则 b = d 2 2 − a 2 b=\frac{\frac{d_{2}}{2}-a}{2} b=22d2a
d 3 = 2 ( ∣ c ∣ + ∣ b ∣ + ∣ a ∣ ) d_{3}=2(|c| + |b| +|a|) d3=2(c+b+a) c = d 2 2 − a − b 1 c=\frac{\frac{d_{2}}{2}-a-b}{1} c=12d2ab

void solve()
{
    int n;
    scanf("%d", &n);
    map<LL, int, greater<LL> > mp;
 
    for (int i = 0; i < 2 * n; i ++ ) 
    {
        LL x; scanf("%lld", &x);
        mp[x] ++;
    }
    bool flag = true;
    for (auto it : mp)
    {
        if (it.se != 2 || it.fi % 2)
        {
            flag = false;
            break;
        }
    }
    if (!flag)
    {
        puts("NO");
        return;
    }
    LL sum = 0;
    for (auto it : mp)
    {
        LL tmp = it.fi / 2 - sum;
        if (tmp <= 0 || tmp % n)
        {
            flag = false;
            break;
        }
        sum += tmp / n;//每次记录计算过的最大值,下一步去掉
        n --;//计算一次去掉一次
    }
    if (!flag) puts("NO");
    else puts("YES");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值