购物 [思维题]

购物


\color{red}{正解部分}

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

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

这里有个神奇的方法,
aia_i 从小到大 排序, 记 aia_i 前缀和sumisum_i,


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

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

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


\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;
}
posted @ 2019-09-29 21:00  XXX_Zbr  阅读(116)  评论(0编辑  收藏  举报