购物 [思维题]

购 物 购物


正 解 部 分 \color{red}{正解部分}

若能凑出 x x x, 则 [ ⌈ x 2 ⌉ , x ] [\lceil \frac{x}{2} \rceil, x] [2x,x] 内的数字全部为 美妙的数字,

美妙的数字 出现范围为 [ 1 , ∑ a i ] [1, \sum a_i] [1,ai], 题目转化 为: 求 [ 1 , ∑ a i ] [1, \sum a_i] [1,ai] 中有多少数字不是 美妙的数字 .

这里有个神奇的方法,
a i a_i ai 从小到大 排序, 记 a i a_i ai 前缀和 s u m i sum_i sumi,


则区间 ( s u m i − 1 , a i 2 ) (sum_{i-1}, \frac{a_i}{2}) (sumi1,2ai) 中的数字必定不是 美妙的数字 .

简单理解为: 小的凑不出来, 大的直接越界 .

于是统计出 绝对不是 美妙的数字 的数量, 用 ∑ a i \sum a_i ai 减去即是答案 .


实 现 部 分 \color{red}{实现部分}

#include<bits/stdc++.h>
#define reg register
typedef long long ll;

int read(){
        char c;
        int s = 0, flag = 1;
        while((c=getchar()) && !isdigit(c))
                if(c == '-'){ flag = -1, c = getchar(); break ; }
        while(isdigit(c)) s = s*10 + c-'0', c = getchar();
        return s * flag;
}

const int maxn = 1e5 + 10;

int N;
int A[maxn];

ll sum;
ll sum_2;

int main(){
        N = read();
        for(reg int i = 1; i <= N; i ++) A[i] = read();
        std::sort(A+1, A+N+1);
        for(reg int i = 1; i <= N; i ++){
                sum_2 += std::max(0ll, (A[i]-1)/2 - sum);
                sum += A[i];
        }
        printf("%lld\n", sum - sum_2);
        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值