cf F. Shovels Shop

https://codeforces.com/contest/1154/problem/F

给定m个折扣

每个折扣的{x,y}的意思是每次购买如果买到确切的x只铲子就其中的最便宜的y只铲子免付;

先贪心一波,因为要买k只,而不管折扣怎么变,怎么买,我们都要买原价最便宜的k只铲子,这贪心是对的

接着就选择折扣offers ,明显要dp解决,贪心贪不出(复杂度太高);

设dp【i】表示买i只铲子的最小花费;

所以转移方程:dp【i】=min(f【i】,(选择折扣的处理));

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=1e15;
const int M=2e5+5;
ll a[M],b[M],dp[M],sum[M];
inline int read(){
    ll sum=0;
    int x=1;
    char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){
        if(ch==‘-‘)
            x=0;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘)
        sum=(sum<<1)+(sum<<3)+(ch^48),ch=getchar();
    return x?sum:-sum;
}
int main(){
    ios::sync_with_stdio(false);
    ll n,m,k;
    n=read();
    m=read();
    k=read();
    for(int i=1;i<=n;i++)
        a[i]=read();
    for(int i=1;i<=m;i++){
        ll x,y;
        x=read();
        y=read();
        if(x<=k)
            b[x]=max(b[x],y);
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=k;i++)
        sum[i]=sum[i-1]+a[i];
    for(int i=1;i<=k;i++)
        dp[i]=inf;
    dp[0]=0;
    for(int i=1;i<=k;i++)
        for(int j=0;j<i;j++)
            dp[i]=min(dp[i],dp[j]+sum[i]-sum[j+b[i-j]]);
    cout<<dp[k];
    return 0;
}

原文地址:https://www.cnblogs.com/starve/p/10726891.html

时间: 2024-11-26 11:58:57

cf F. Shovels Shop的相关文章

CF F. Shovels Shop(前缀和预处理+贪心+dp)

F. Shovels Shop time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output There are nn shovels in the nearby shop. The ii -th shovel costs aiai bourles. Misha has to buy exactly kk shovels. Each sho

CF F. Royal Questions kruskal

Code: #include<bits/stdc++.h> #define ll long long #define maxn 200004 using namespace std; void setIO(string s) { string in=s+".in"; freopen(in.c_str(),"r",stdin); } int n,m; int p[maxn],tag[maxn]; void init() { for(int i=0;i<

linux基本知识2

vi/vim工具使用 vi三种模式: 1.浏览模式(命令模式) 2.输入模式 3.末行模式 三种模式切换: 浏览模式(命令模式)    按"i" "a"      输入模式 输入模式   按"esc"        浏览模式(命令模式) 浏览模式(命令模式)    按shif+:      末行模式 浏览模式经常使用的命令: 删除一行  dd 删除多行  ndd (n=1,2,3) 复制一行  yy 复制多行  nyy (n=1,2,3) 粘贴

搭建emacs的go编程语言环境

关于emacs就不说明了,直接切入主题.关于我的emacs配置,可以直接参考GitHub上的lienhua34/myemacs-conf. go-mode 安装 关于go-mode的安装,可以直接参考GitHub.从github上下载go-mode.el或go-mode-autoloads.el文件到你本地的某个目录下,然后在~/.emacs文件中输入下面内容: (add-to-list 'load-path "/path/to/your/dir") (require 'go-mode

windows 下SVN搭建(linux下晚些记录。。。)

一..基础 1.安装服务端,安装客户端(小乌龟...) 2.建立仓库:svnadmin create f:\web\shop 3.启动仓库 svnserve -d -r f:\web\shop 4.shop\conf\svnserve.conf 约 12行 #anon-access = read 修改为 anon-access = write (前面不能含空格)意思是允许匿名提交 5.checkout... 二.设置账户密码 1..引进配置文件shop\conf\svnserve.conf修改

java获取当前执行文件的路径

需要知道执行jar包时,jar包所在的路径. 开始使用了 p.getClass().getResource("/").getPath(); 结果在IDE里面使用是好的,但是在命令行中执行时,会报NullPointerException错误. 接着尝试使用另一种方式, File f = new File(""); String cf = null; try { cf = f.getCanonicalPath(); } catch (IOException e) { e

SQLSERVER数据库主要状态

一个SQLSERVER数据库会处于很多种状态,例如 ONLINE .OFFLINE,RESTORING .RECOVERING .RECOVERY_PENDING  .SUSPECT.EMERGENCY . 只有在ONLINE的状态下,数据库才能被正常访问. 可以利用下面的语句来查看它的状态 select name,state_desc from sys.databases 1.ONLINE 只有在ONLINE的状态下,数据库才能被正常访问 2.OFFLINE 我们可以在Microsoft SQ

hive中udf读写hbase

在大数据开发过程中经常会遇到,将hive中处理后的结果写入hbase中,每次都要写java程序会非常浪费时间,我们就想了一个办法 ,用hive的udf来实现. 只需要调用同一个udf,将表名字段名以及每一个字段的值作为udf的参数,就可以实现写hbase了. 这样大大的节省了开发时间,提升了开发效率. 大家可以按照这种思路写自己需要的功能.这里只简单的列举几个供大家参考,具体操作如下: 一.依赖的jar包 commons-codec-1.7.jar commons-collections-3.2

ATM 练习

bank.py __author__ = 'zhaobin022' import json import tools import getpass import datetime class DatabaseHelper: def __init__(self): self.database = 'db.json' ''' self.accountDic = {'zhangsan': {'total':0, 'password':tools.getMd5Password('123'), 'stat