[BZOJ2298] [HAOI2011] problem a (dp)

Description

  一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低。”问最少有几个人没有说真话(可能有相同的分数)

Input

  第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai、bi

Output

  一个整数,表示最少有几个人说谎

Sample Input

3
2 0
0 2
2 2

Sample Output

1

HINT

  100%的数据满足: 1≤n≤100000   0≤ai、bi≤n

Source

Solution

  a个人在他前面,b个人在他后面,相当于名次在$[b+1,n-a]$中的人分数一样(分数按非降序排列)

  如果这个人说的是真话,其对应的区间不会和其他区间相交。

  $f[i]$表示名次第1~i的人最多有多少人说真话,转移方程看程序,我相信你能理解_(:3 」∠)_

  哦,,,选取的线段可以重合。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define fir first
 4 #define sec second
 5 map<int, int> Map[100005];
 6 map<int, int>::iterator it;
 7 int f[100005];
 8 int main()
 9 {
10     int n, a, b;
11     cin >> n;
12     for(int i = 1; i <= n; i++)
13     {
14         cin >> a >> b;
15         if(n - a > b) Map[b][n - a]++;
16     }
17     for(int i = 0; i < n; i++)
18     {
19         for(it = Map[i].begin(); it != Map[i].end(); it++)
20             f[it->fir] = max(f[it->fir], f[i] + min(it->sec, it->fir - i));
21         f[i + 1] = max(f[i + 1], f[i]);
22     }
23     cout << n - f[n] << endl;
24     return 0;
25 }

时间: 2024-09-28 14:56:52

[BZOJ2298] [HAOI2011] problem a (dp)的相关文章

【BZOJ2298】[HAOI2011]problem a DP

[BZOJ2298][HAOI2011]problem a Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Output 一个整数,表示最少有几个人说谎 Sample Input 3 2 0 0 2 2 2 Sample Output 1 HINT 100%的数据满足: 1≤n≤100000   0≤

BZOJ 2302: [HAOI2011]Problem c( dp )

dp(i, j)表示从i~N中为j个人选定的方案数, 状态转移就考虑选多少人为i编号, 然后从i+1的方案数算过来就可以了. 时间复杂度O(TN^2) --------------------------------------------------------------------- #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long lo

BZOJ 2302: [HAOI2011]Problem c [DP 组合计数]

2302: [HAOI2011]Problem c Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 648  Solved: 355[Submit][Status][Discuss] Description 给n个人安排座位,先给每个人一个1~n的编号,设第i个人的编号为ai(不同人的编号可以相同),接着从第一个人开始,大家依次入座,第i个人来了以后尝试坐到ai,如果ai被占据了,就尝试ai+1,ai+1也被占据了的话就尝试ai+2,……,如果一直

bzoj2298 [HAOI2011]problem a

Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Output 一个整数,表示最少有几个人说谎 Sample Input 3 2 0 0 2 2 2 Sample Output 1 HINT 100%的数据满足: 1≤n≤100000   0≤ai.bi≤n 正解:$dp$+树状数组优化. 对于每一个人

[HAOI2011] Problem C - dp

给 \(n\) 个人安排座位,每个人手上有一个编号 \(a_i\).从第一个人开始依次进场,每个人进场后,会从 \(a_i\) 往后找到第一个空着的座位就做,如果没找到则这个方案不合法.现在有 \(m\) 个人的座位已经确定(不同人的编号可以相同),求有多少种合法的安排方案. \(T\leq 10, n \leq 300\) Solution 考虑怎样的情况的是无解的,设 \(s_i\) 表示编号既定的 \(m\) 人中编号 \(\geq i\) 的人数,对于 \(s_i>n-i+1\) 显然是

BZOJ 2298: [HAOI2011]problem a 动态规划

2298: [HAOI2011]problem a Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=2298 Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话(可能有相同的分数) Input 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi Outp

[luogu] P2519 [HAOI2011]problem a (贪心)

P2519 [HAOI2011]problem a 题目描述 一次考试共有n个人参加,第i个人说:"有ai个人分数比我高,bi个人分数比我低."问最少有几个人没有说真话(可能有相同的分数) 输入输出格式 输入格式: 第一行一个整数n,接下来n行每行两个整数,第i+1行的两个整数分别代表ai.bi 输出格式: 一个整数,表示最少有几个人说谎 输入输出样例 输入样例#1: 复制 3 2 0 0 2 2 2 输出样例#1: 复制 1 说明 100%的数据满足: 1≤n≤100000 0≤ai

HDU 4971 A simple brute force problem.(dp)

HDU 4971 A simple brute force problem. 题目链接 官方题解写的正解是最大闭合权,但是比赛的时候用状态压缩的dp也过掉了- -,还跑得挺快 思路:先利用dfs预处理出每个项目要完成的技术集合,那么dp[i][j]表示第i个项目,已经完成了j集合的技术,由于j这维很大,所以利用map去开数组 代码: #include <cstdio> #include <cstring> #include <algorithm> #include &l

[BZOJ 2301] [HAOI2011] Problem b

2301: [HAOI2011]Problem b Time Limit: 50 SecMemory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数n,接下来n行每行五个整数,分别表示a.b.c.d.k Output 共n行,每行一个整数表示满足要求的数对(x,y)的个数 Sample Input 2 2 5 1 5