【链接】 我是链接,点我呀:)

【题意】

给你k个红包,每个红包可以在si..ti的时间范围内拿走。
抢完红包之后你得到wi元,然后你需要在di+1时刻才能继续抢红包
时间是线性的从1..n
然后某个人可以阻止你在x时刻抢红包,然后你的时间跳过1s(-1s)直接到达x+1时刻.
这个人可以阻止你m次。
请问这个人采用最优阻止策略下,你最少抢到的金额。
(如果有多个可以抢的红包,那么抢wi最大的,如果仍然相同抢di最大的,再相同的话就无所谓了,因为选哪个都一样了)

【题解】

dp
设dp[i][j]表示i时刻已经用了j次阻止机会,后面能抢到的最少金额.
我们可以用sort+优先队列求出choose[i]
即表示i时刻你会选择哪一个红包(注意是排序后的红包QAQ)
那么在i时刻有两种选择
1.这个人进行干扰
那么转移到dp[i+1][j+1]
2.这个人不进行干扰
那么如果i时刻有的选
就转移到dp[a[choose[i]].d+1][j]+a[choose[i]].w
如果没得选就转移到dp[i+1][j]

每次取最小值就好

记得开long

【代码】

import java.io.*;
import java.util.*; public class Main { static InputReader in;
static PrintWriter out; static class RedEnvelope{
int s,t,d,w,id;
} public static Comparator<RedEnvelope> cmp1 = new Comparator<Main.RedEnvelope>() {
@Override
public int compare(RedEnvelope o1, RedEnvelope o2) {
return o1.s-o2.s;
}
}; public static Comparator<RedEnvelope> cmp2 = new Comparator<Main.RedEnvelope>() {
@Override
public int compare(RedEnvelope o1, RedEnvelope o2) {
if (o1.w==o2.w) {
return o2.d-o1.d;
}else {
return o2.w-o1.w;
}
}
}; static int N = (int)1e5;
static int n,m,k;
static RedEnvelope a[];
static int choose[];
static PriorityQueue<RedEnvelope> pq;
static long dp[][]; static long dfs(int t,int cnt) {
if (dp[t][cnt]!=-1) return dp[t][cnt];
if (t>n) return 0;
//打扰t时刻
long temp1 = (long)1e17;
if (cnt+1<=m) temp1 = Math.min(temp1, dfs(t+1,cnt+1)); //不打扰
long temp2 = (long)1e17;
if (choose[t]!=-1) {
temp2 = Math.min(temp2,dfs(a[choose[t]].d+1,cnt)+a[choose[t]].w);
}else {
temp2 = Math.min(temp2, dfs(t+1,cnt));
} dp[t][cnt] = Math.min(temp1, temp2);
return dp[t][cnt];
} public static void main(String[] args) throws IOException{
in = new InputReader();
out = new PrintWriter(System.out); //code start from here
a = new RedEnvelope[N+10];
for (int i = 1;i <= N;i++) a[i] = new RedEnvelope(); pq = new PriorityQueue<>(cmp2);
choose = new int[N+10];
dp = new long[N+10][200+10];
for (int i = 0;i <= N;i++)
for (int j = 0;j <= 200;j++)
dp[i][j] = -1; n = in.nextInt();m = in.nextInt();k = in.nextInt(); for (int i = 1;i <= k;i++) {
a[i].s = in.nextInt();
a[i].t = in.nextInt();
a[i].d = in.nextInt();
a[i].w = in.nextInt();
}
Arrays.sort(a, 1,k+1,cmp1);
for (int i = 1;i <= k;i++) a[i].id = i;//排完序再标号!QAQ
int j = 1; for (int i = 1;i <= n;i++) {
for (;j<=k;) {
if (a[j].s<=i) {
pq.add(a[j]);
j++;
}else break;
}
while (!pq.isEmpty()) {
RedEnvelope temp = pq.peek();
if (temp.t<i) {
pq.poll();
continue;
}
choose[i] = temp.id;
break;
}
if (pq.isEmpty()) choose[i] = -1;
} out.println(dfs(1,0));
out.close();
} static class InputReader{
public BufferedReader br;
public StringTokenizer tokenizer; public InputReader() {
br = new BufferedReader(new InputStreamReader(System.in));
tokenizer = null;
} public String next(){
while (tokenizer==null || !tokenizer.hasMoreTokens()) {
try {
tokenizer = new StringTokenizer(br.readLine());
}catch(IOException e) {
throw new RuntimeException(e);
}
}
return tokenizer.nextToken();
} public int nextInt() {
return Integer.parseInt(next());
}
}
}

【Codeforces 1106E】Lunar New Year and Red Envelopes的更多相关文章

  1. 【Codeforces 1106E】 Lunar New Year and Red Envelopes

    Codeforces 1106 E 题意:有\(k\)个红包,第\(i\)个红包可以在\(s_i\)到\(t_i\)的时间内抢,同时获得\(w_i\)的钱,但是抢完以后一直到\(d_i\)都不可以继续 ...

  2. 【Codeforces 1106D】Lunar New Year and a Wander

    [链接] 我是链接,点我呀:) [题意] 让你遍历n个节点,访问过的节点不操作. 如果是没有访问过的点,那就把它加到序列的末尾. 问你形成的最小字典序的序列是多少. [题解] 显然每次找最小的标号 用 ...

  3. 【Codeforces 1106C】Lunar New Year and Number Division

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 看了下样例解释就懂了... 每次选择最大最小的两个组合 然后加起来.. [代码] import java.io.IOException; im ...

  4. 【Codeforces 1106B】Lunar New Year and Food Ordering

    [链接] 我是链接,点我呀:) [题意] 给你n个菜以及每个人需要的菜以及数量 如果某个人无法满足它对菜的需求的话 就用价格比较低的菜来填充它的要求. (如果价格低的菜不够了,那么就直接输出0) 否则 ...

  5. Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)

    题意:过年了,Bob要抢红包.抢红包的时间段为1 - n,有m个红包,每个红包有三个属性:st(红包出现的时间), ed(红包消失的时间),d(如果抢了这个红包,能够抢下一个红包的时间),w(红包的收 ...

  6. Codeforces 1106 E. Lunar New Year and Red Envelopes 优先队列+dp

    题意大致是Bob新年拿红包,每个红包可以在s-t时间内取,但是取了之后得在d+1时间开始才能继续取红包. 同时他女儿能在m个时间点阻止他取红包,求女儿阻止后Bob取得的w总和最小值. Bob取红包的策 ...

  7. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  8. Codeforces 1106E. Lunar New Year and Red Envelopes(DP)

    E. Lunar New Year and Red Envelopes 题意: 在长度为n的时间轴上,有k个红包,每个红包有领取时间段[s,t],价值w,以及领了个这个红包之后,在时间d到来之前无法再 ...

  9. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

随机推荐

  1. RxJava使用介绍

    主讲人:阳石柏 RxJava基本概念 背压概念介绍 RxJava 2.0版本介绍及更新 一.RxJava基本概念 RxJava 在 GitHub 主页上的自我介绍是 “a library for co ...

  2. Java 下的函数对象

    1. 举例 如我们要创建一个对大小写敏感的,按照字母序排序的 Set,我们需要向 Set 的构造器传入 String.CASE_INSENTIVE_ORDER 的比较器: Set<String& ...

  3. [SDOI 2009] 晨跑

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1877 [算法] 不难看出,第一问要求的是最大流,第二问求的是最小费用最大流 注意建图 ...

  4. RDA 升级

    烧录BOOT升级方式: 1.连接 2.烧录BOOT 1)升级“bootrom_raw.bin” 99K,这种升级方式需要Tera Term 工具,按“F5”  U盘升级. 编译的升级文件“RR8503 ...

  5. php自动加载的两个函数__autoload和__sql_autoload_register

    一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.class.php //文件 <?php class P ...

  6. [App Store Connect帮助]二、 添加、编辑和删除用户(3)添加和编辑用户

    您可以在“用户和访问”中添加和编辑用户. 如果您以个人名义在“Apple 开发者计划”注册,您可以授权用户访问您 App Store Connect 中的内容.所有用户只拥有 App Store Co ...

  7. 【洛谷2926/BZOJ1607】[USACO08DEC]Patting Heads拍头(筛法)

    题目: 洛谷2926 (截止至本博客发表时,BZOJ1607题面有误,正确题面请到洛谷2926查看) 分析: = 一句话题意:给定\(n\)个数\(\{a_i\}\),求对于每个\(a_i\)有多少个 ...

  8. ACM_他和她(最大生成树+最短路径)

    他和她 Time Limit: 2000/1000ms (Java/Others) Problem Description: 大二上学期刚过完,平时成绩不错的小V参加了一个小型编程比赛,遇到一道题,虽 ...

  9. Android App签名(为apk签名)

    最近有朋友问到 android 签名的问题,所以转一篇给大家分享: 这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开 ...

  10. MySQL关于存储过程

    代码示例: 1.IN输入参数: delimiter // create PROCEDURE proc1(IN sid int) begin select * from student where id ...