购物(sum)

本文介绍了一种计算美妙数的方法,美妙数定义为在给定商品价格集合中,能够通过选购若干商品使其价格之和落入特定区间的正整数。文章详细阐述了解题思路,包括商品价格的排序、合法区间确定及最终美妙数计数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【from new_dtoj 3966:购物(sum)】
题目描述
visit_world有一个商店,商店里卖N个商品,第i 个的价格为ai{a_i}ai我们称一个正整数K是美妙的,当且仅当我们可以在商店里选购若干个商品,使得价格之和落在区间[K,2K]中。
问:有多少个美妙的数。
输入
第一行一个整数N。
接下来一行N个整数,描述数组a。
输出
输出一行一个整数,表示答案。
样例输入
3
1 2 3
样例输出
6
提示
解释
可以证明1≤K≤6 都是美妙的,除此之外的数都不是美妙的。
数据范围和子任务
N≤105{10^5}105,ai{a_i}ai109{10^9}109且为正整数
子任务 1(30 分):N≤100,ai{a_i}ai≤100 .
子任务 2(20 分):N≤105{10^5}105,ai{a_i}ai≤20.
子任务 3(20 分):N≤3,ai{a_i}ai109{10^9}109 .
子任务 4(30 分):N≤105{10^5}105,ai{a_i}ai109{10^9}109 .
题解
首先我们先将ai{a_i}ai从小到大排序,对于每个ai{a_i}ai,它的合法区间是[(ai{a_i}ai+1)/2,ai{a_i}ai]
si{s_i}si表示前i个数的和
因为最终答案的范围在(a1{a_1}a1+1)/2到sn{s_n}sn中,所以我们可以考虑在这个范围内,哪几块的k值也是不能选的,最后减去即可
假设已经处理前i-1次要减去的值,现在考虑第i次要减去什么,这里应该分成两类

  1. (ai{a_i}ai+1)/2<=si−1{s_{i-1}}si1
    因为 (ai{a_i}ai+1)/2<=si−1{s_{i-1}}si1,所以在(ai{a_i}ai+1)/2到si−1{s_{i-1}}si1已经处理完全了,而si−1{s_{i-1}}si1~ai{a_i}ai都是可取的,可以发现ai{a_i}aisi{s_i}si这一块也处理过了,所以在这里并不需要减去什么
  2. (ai{a_i}ai+1)/2>si−1{s_{i-1}}si1
    同上方类似,唯一不同的是可以发现si−1{s_{i-1}}si1~(ai{a_i}ai+1)/2中的k值是去不到的,所以要把这一块数的个数减去

具体代码如下

#include <cstdio>
#include <algorithm>
using namespace std;
int n;long long a[100005],m,s,r;
int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
    sort(a+1,a+n+1);
    for (int i=1;i<=n;s+=a[i],i++)
        if (((a[i]+1)/2)>s) m-=((a[i]+1)/2)-s-1;
    return printf("%lld\n",m+s),0;
}
JaneLee简单购物车源码 功能描述:商品的分类显示、浏览商品、用户登录、选购和调整购物车、集中结算、存储订单、查看订单 各网页的联系如下: 主界面-》商品分类显示-》购物车-》结帐-》查看订单 理解系统的关键是搞清GridView、内存数据表与Session对象三者之间的关系。 系统的执行过程是: 进入“主界面”,显示商品分类,以及欢迎界面;在分类数据表(Categories)中任选一种数据类型,同步打开“产品”网页,用GridView控件分类显示Products数据表中相应的商品;单击想要购买的商品,将该商品的数据取出来,放到动态数据表中,然后再将数据表放入“购货车”中,这里的购货车用Session['ShoppingCart']表示;打开“购货车”网页,控件GridView以Session['ShoppingCart']作为数据源显示数据,并在新网页中确定购买的数量,并输入“客户标志”;与此同时生成新的内存数据表,并将新数据表存入新的Session['ShoppingCart2']中;打开“结账”网页,以新Session对象作为数据源在GridView控件中显示数据,同时通过Session['khbj']将客户标志传入到网页中;在“结账”网页中完成计算总价的工作,最后存入订单;在“查看订单”网页中以客户标志作为查询条件显示订单,以便只显示客户本人的订单部分。 在上述各个阶段中,都允许客户对数据进行选择和修改。除开始阶段和最后阶段需要直接存取数据库以外,其他部分均采用内存动态数据表来组织数据,这样做可以提高系统的运行效率。 客户标志是识别客户的惟一标志,平时存放在客户登录表中,包括有联系地址、联系方法等。 database下为Sql数据库文件,附加即可 作者:JaneLee
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值