K for the Price of One

B. K for the Price of One (Hard Version)

赛时失手推错了规律...

这个题不是单调递增的

但是它有一个规律:当买同样多的东西时,优先买便宜的

所以我们可以求出买 i 个东西时最便宜的价格

sort(a+1,a+n+1);
for(int i=1;i<=k-1;++i)
    dp[i]=a[i]+dp[i-1];
for(int i=k;i<=n;++i)
    dp[i]=dp[i-k]+a[i];

因为考虑到 n 只有2e5的范围,所以把每一个\(dp[i]\)都遍历一遍找到最大值即可

代码:

// Created by CAD on 2020/1/13.
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int maxn=2e5+5;
ll a[maxn];
ll dp[maxn];
ll n,p,k;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;  cin>>t;
    while(t--)
    {
        cin>>n>>p>>k;
        for(int i=1;i<=n;++i)
            cin>>a[i];
        sort(a+1,a+n+1);
        for(int i=1;i<=k-1;++i)
            dp[i]=a[i]+dp[i-1];
        for(int i=k;i<=n;++i)
            dp[i]=dp[i-k]+a[i];
        int ans=0;
        for(int i=1;i<=n;++i)
            if(dp[i]<=p)
                ans=max(ans,i);
        cout<<ans<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/CADCADCAD/p/12191383.html

时间: 2024-11-01 00:48:37

K for the Price of One的相关文章

CF #610Div2 B2.K for the Price of One (Hard Version) (dp解法 &amp;&amp; 贪心解法)

题目大意:刚开始有 p 块钱,商店有 n 件物品,你每次可以只买一件付那一件的钱,也可以买 k 件只付最贵那件的钱,问你最多能买几件 (k<=n<=2e5) 首先我们要明确,如果你买了这一件商品,那么你一定买了比这件商品价格低的所有商品,因为这样买花的钱才会更少,方法才是最优的. 解法一:这道题用 背包dp 解应该是最直观的,先排序一下,状态要么由前一件转移过来,要么由前 k 件转移过来,即 dp[i] = min(dp[i-1]+a[i],dp[i-k]+a[i])然后我们只要找到买哪一件之

POJ1062 昂贵的聘礼 【DFS】

昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37475   Accepted: 10816 Description 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了,于是便向酋长去求亲.酋长要他用10000个金币作为聘礼才答应把女儿嫁给他.探险家拿不出这么多金币.便请求酋长减少要求.酋长说:"嗯,假设你能够替我弄到大祭司的皮袄,我能够仅仅要8000金币.假设你能够弄来他的水晶球,那么仅仅要50

php 实现购物车功能,以大苹果购物网为例,上图上代码。。。。

首先是几个简单的登录页面 <body> <form action="chuli.php" method="post"> <div style="margin-left: 500px; margin-top: 200px; height: 250px; width: 250px; border: 1px dashed black"> <div style="margin-left: 100px;

旅游规划(25)

这道题一开始我用dfs写了一次 = = 结果时间超限 对于这种最短路径的问题来讲,效率更高的肯定是Floyd算法和Dijkstra算法 单源最短路径最好自然是用Dijkstra,不过Floyd写起来简单,我就这样写咯 #include <iostream> #define INF 99999 using namespace std; int n, m, s, d; int map[500][500]; int price[500][500]; int main() { /*纯洁的初始化!*/

day01课程回顾,数据类型,(用户登录限制登录三次,购物车,省市县三级联动)

Day01 Python的分类 Cpython:代码àc字节码->机器码   一行一行的编译执行 Pypy:   代码àc字节码->机器码   全部转换完再执行 其他python  代码-->其他字节码-->机器码 Python的执行 Windows:C:\Python35\python.exe    D:\1.txt(python可执行文件路径---解释器   执行文件) Linux:可以在文件的头部写#!/usr/bin/python    python安装路径(用命令wher

PHP foreach 循环使用&quot;&amp;$val&quot; 地址符“&amp;”

在熟悉项目代码的时候 看到这样的foreach 循环: foreach($data as &$val){ .... } 第一次看到循环里面使用了地址符"&",我印象中的这个符号 是直接取到了这个变量的地址. 然后里面的循环操作,相对来说是高大上了点,比如说下面的例子: 我现在有一个需求 给一个数组添加一个元素,经常会有这种需求     商品统计:商品价格.商品销售数量    需求是 想统计出商品总收入 $arr = array( array('price' =>1

动态规划-多重背包问题

0-1背包问题 完全背包问题 多重背包问题是0-1背包问题和完全背包问题的综合体,可以描述如下:从n种物品向容积为V的背包装入,其中每种物品的体积为w,价值为v,数量为k,问装入的最大价值总和? 我们知道0-1背包问题是背包问题的基础,所以在解决多重背包问题的时候,要将多重背包向0-1背包上进行转换.在多重背包问题中,每种物品有k个,可以将每种物品看作k种,这样就可以使用0-1背包的算法.但是,这样会增加数据的规模.因为该算法的时间复杂度为O(V*∑ni=1ki),所以要降低每种物品的数量ki.

CodeForces 12C Fruits

Fruits Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 12C Description The spring is coming and it means that a lot of fruits appear on the counters. One sunny day little boy Valera deci

java中的xml简介与DOM解析xml

1. xml简介 XML:指可扩展标记语言, Extensible Markup Language:类似HTML.XML的设计宗旨是传输数据,而非显示数据. 一个xml文档实例: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <company name="Tencent" address="深圳市南山区"> 3 <department deptNo=&quo