原题链接:
http://codeforces.com/contest/1282/problem/B2
题目大意:
刚开始有 p 块钱,商店有 n 件物品,你每次可以只买一件付那一件的钱,也可以买 k 件只付最贵那件的钱,问你最多能买几件 (k<=n<=2e5) 首先我们要明确,如果你买了这一件商品,那么你一定买了比这件商品价格低的所有商品,因为这样买花的钱才会更少,方法才是最优的。 解法一:
这道题用 背包dp 解应该是最直观的,先排序一下,状态要么由前一件转移过来,要么由前 k 件转移过来,即 dp[i] = min(dp[i-1]+a[i],dp[i-k]+a[i])
然后我们只要找到买哪一件之前花的钱 <=p 就好了。
 #include <iostream>
#include <algorithm>
using namespace std;
const int N = 2e5 + ;
int t, n, p, k, ans, a[N], dp[N];
int main()
{
ios::sync_with_stdio(false);
cin >> t;
while (t--)
{
cin >> n >> p >> k;
for (int i = ; i <= n; i++)
cin >> a[i];
sort(a + , a + n + );
ans = ;
for (int i = ; i <= n; i++)
{
dp[i] = dp[i - ] + a[i];
if (i >= k)
dp[i] = min(dp[i], dp[i - k] + a[i]);
if (dp[i] <= p)
ans = max(ans, i);
}
cout << ans << '\n';
}
return ;
}
// 93ms

解法二:

其实很多人最开始想到的都是贪心,我们不难发现,尽量使用第二个技能永远是最佳的,一旦第二个技能不能再使用,剩下的钱我们就一个一个去买前面价格低的。所以我们只要枚举前 k-1 个单买( >=k 个的话我们只要用第二个技能买一定更划算),后面的我们全部用第二个技能买就行了,维护可以买到的数量最大值就好了。

 #include <iostream>
#include <algorithm>
using namespace std;
const int N = 2e5 + ;
int t, n, p, k, a[N];
int main()
{
ios::sync_with_stdio(false);
cin >> t;
while (t--)
{
cin >> n >> p >> k;
for (int i = ; i < n; i++)
cin >> a[i];
sort(a, a + n);
int now = , pre = , ans = , cnt = ;
for (int i = ; i < k; i++)
{
now = pre;
cnt = i; // 单买前 cnt 个商品,目前花费 now 元
if (now > p)
break;
for (int j = i + k - ; j < n; j += k) // 第 i 件之后的全部用二技能买
{
now += a[j];
if (now <= p)
cnt += k;
else
break;
}
ans = max(ans, cnt);
pre += a[i];
}
cout << ans << '\n';
}
return ;
}
// 108ms

CF #610Div2 B2.K for the Price of One (Hard Version) (dp解法 && 贪心解法)的更多相关文章

  1. codeforces 1282B2. K for the Price of One (Hard Version) (dp)

    链接 https://codeforces.com/contest/1282/problem/B2 题意: 商店买东西,商店有n个物品,每个物品有自己的价格,商店有个优惠活动,当你买恰好k个东西时可以 ...

  2. CF gym 101933 K King's Colors —— 二项式反演

    题目:http://codeforces.com/gym/101933/problem/K 其实每个点的颜色只要和父亲不一样即可: 所以至多 i 种颜色就是 \( i * (i-1)^{n-1} \) ...

  3. CF gym 101933 K. King's Colors(二项式反演)

    传送门 解题思路 首先给出的树形态没用,因为除根结点外每个点只有一个父亲,它只需要保证和父亲颜色不同即可.设\(f(k)\)表示至多染了\(k\)种颜色的方案,那么\(f(k)=(k-1)^{(n-1 ...

  4. CF 319C - Kalila and Dimna in the Logging Industry 斜率优化DP

    题目:伐木工人用电锯伐木,一共需要砍n棵树,每棵树的高度为a[i],每次砍伐只能砍1单位高度,之后需要对电锯进行充电,费用为当前砍掉的树中最大id的b[id]值.a[1] = 1 , b[n] = 0 ...

  5. cf161d 求距离为k的点对(点分治,树形dp)

    点分治裸题,但是用树形dp也能做 /* dp[u][k]表示在u下距离k的点数量 */ #include<bits/stdc++.h> using namespace std; ]; ], ...

  6. CF 462 C. A Twisty Movement 分段想 线段树 或 dp

    题意 有一个只包含1和2的序列,试翻转一个区间,使得结果中非连续非递减数列最长. 思路 一. 作出1的前缀计数和为cnt1,2的后缀计数和为cnt2, 由于要找出[1,1,1][2,2,2][1,1, ...

  7. LeetCode1005 K次取反后最大化的数组和(贪心+Java简单排序)

    题目: 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修 ...

  8. ACM-ICPC 2016 大连赛区现场赛 K. Guess the number && HDU 5981(思维+DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5981 题意:A在[L, R]之间随机选取一个数X,之后B来猜这个数,如果猜的数比X小,那么A就告诉B猜 ...

  9. Codeforces Round #610 (Div. 2) A-E简要题解

    contest链接: https://codeforces.com/contest/1282 A. Temporarily unavailable 题意: 给一个区间L,R通有网络,有个点x,在x+r ...

随机推荐

  1. 008、Java中变量与常量的区别

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. manjaro更换深度桌面 卸载ked桌面

    下载需要的桌面环境 pacman -S deepin deepin-extra 修改/etc/lightdm/lightdm.conf sudo nano /etc/lightdm/lightdm.c ...

  3. Golang的循环结构-for语句

    Golang的循环结构-for语句 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.for循环语法 循环结构在生活中的场景也非常的多,比如: ()上班族们每天朝九晚五的生活; ( ...

  4. UVA - 548 Tree(二叉树的递归遍历)

    题意:已知中序后序序列,求一个叶子到根路径上权和最小,如果多解,则叶子权值尽量小. 分析:已知中序后序建树,再dfs求从根到各叶子的权和比较大小 #include<cstdio> #inc ...

  5. HihoCoder第六周:01背包问题

    01背包问题大二的时候就接触过了,几行关键代码自己也都看过很多遍了,但是很多代码一直都没能理解.所以今天拿表来好好地画一画,弄懂其中的动态规划究竟什么含义. 1038 : 01背包 时间限制:2000 ...

  6. [JZOJ]1293.气象牛[区间DP]

    Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1-M_N(1 <= M_i <= 1 ...

  7. 75.Python中ORM聚合函数详解:Sum

    Sum:某个字段的总和. 1. 求图书的销售总额,示例代码如下: from django.http import HttpResponse from django.db import connecti ...

  8. Swift 协议protocol

    // associatedtype 关键字 用来声明一个类型的占位符作为协议定义的一部分 protocol LXFViewModelType { associatedtype Input associ ...

  9. 启用sql日志

    SHOW VARIABLES LIKE "general_log%"; -- 查询是否启用日志 SET GLOBAL general_log = 'ON';  -- 设置启用 SE ...

  10. Windows2008R2安装iis和iis下搭建web服务器(9.18 第七天)

    IIS internet information services 互联网信息服务微软开发的运行在windows中的互联网服务,提供了web.ftp.smtp服务 Windows server 200 ...