[bzoj3193][JLOI2013]地形生成_排列组合_贪心
[JLOI2013]地形生成
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3193
题解:
这种求总排列的题,一种常规做法就是所有的元素按照某种排列方式然后一个一个往里插。
这个题就是从大到小排序这样,对后面的元素没有影响。
现在有一些相等的元素我们怎么弄?
如果是标号序列的话,就是瞎$jb$排就行了。
如果是等高线序列的话,只要按照$a$作为第二关键字就好。
代码:
#include <bits/stdc++.h>
#define N 1010
using namespace std;
const int mod = 2011 ;
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
int x = 0, f = 1;
char c = nc();
while (c < 48) {
if (c == '-')
f = -1;
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
}
struct Node {
int h, rk;
}a[N];
int dp[N];
inline bool cmp(const Node &a, const Node &b) {
return a.h == b.h ? a.rk < b.rk : a.h > b.h;
}
int main() {
int n = rd();
for (int i = 1; i <= n; i ++ ) {
a[i].h = rd(), a[i].rk = rd() - 1;
}
int ans1 = 1, ans2 = 1;
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i ++ ) {
int dic = i;
while (dic <= n && a[dic].h == a[i].h) {
dic ++ ;
}
dic -- ;
memset(dp, 0, sizeof dp);
dp[0] = 1;
for (int j = i; j <= dic; j ++ ) {
ans1 = ans1 * (min(i, a[j].rk + 1) + j - i) % mod;
for (int k = 1; k <= min(a[j].rk, i - 1); k ++ ) {
dp[k] = (dp[k - 1] + dp[k]) % mod;
}
}
int sum = 0;
for (int j = 0; j <= min(a[dic].rk, i - 1); j ++ ) {
(sum += dp[j]) %= mod;
}
(ans2 *= sum) %= mod;
i = dic;
}
cout << ans1 << ' ' << ans2 << endl ;
return 0;
}
小结:记得,考虑问题的时候把当前时间戳这个容易忽略的变量也考虑进去,尽管大部分时候都用不到。
[bzoj3193][JLOI2013]地形生成_排列组合_贪心的更多相关文章
- [Bzoj3193][JLOI2013]地形生成 (排列组合 + DP)
3193: [JLOI2013]地形生成 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 459 Solved: 223[Submit][Status ...
- BZOJ3193 [JLOI2013]地形生成 【dp】
题目链接 BZOJ3193 题解 注意\(key\)是小于 第一问,显然按高度降序排序,逐个插入 如果高度各不相同,那么之前插入的都比当前插入的\(i\)大,可插入的位置个数就确定了 由于存在高度相同 ...
- BZOJ3193: [JLOI2013]地形生成
传送门 Sol 第一问可以考虑按照山的高度从大到小放 但是这样如果遇到高度相同的就不好考虑,那么同时要求数量限制从小到大 这样每次放的时候后面的一定不会影响前面,并且高度相同的时候前面能放的位置后面的 ...
- 【BZOJ3193】 [JLOI2013]地形生成
BZOJ3193 [JLOI2013]地形生成 Solution 第一问不是很简单吗? 直接计数就好了. 第二问思考无果看了看hyj神仙的代码,发现可以dp求解. 具体可以看代码(其实主要是我说不清楚 ...
- 【BZOJ3193】[JLOI2013]地形生成 DP
[BZOJ3193][JLOI2013]地形生成 Description 最近IK正在做关于地形建模的工作.其中一个工作阶段就是把一些山排列成一行.每座山都有各不相同的标号和高度.为了遵从一些设计上的 ...
- 【BZOJ3193】[JLOI2013]地形生成(动态规划)
[BZOJ3193][JLOI2013]地形生成(动态规划) 题面 BZOJ 洛谷 题解 第一问不难,首先按照山的高度从大往小排序,这样子只需要抉择前面有几座山就好了.然而有高度相同的山.其实也不麻烦 ...
- cb47a_c++_STL_算法_排列组合next_prev_permutation
cb47a_c++_STL_算法_排列组合next_prev_permutation 使用前必须先排序.必须是 1,2,3或者3,2,1.否者结果不准确.如果, 1,2,4,6.这样数据不会准确nex ...
- [JLOI2013]地形生成[组合计数]
题意 \(n\) 元素各有一个高度 \(h\) 和关键数字 \(b\) .求有多少个下标序列和高度序列,满足对任意 \(i\),\(j< i\) 且 \(h_j < h_i\)的 \(j\ ...
- [LuoguP2159][SHOI2009]舞会_动态规划_高精度_排列组合
舞会 题目链接:https://www.luogu.org/problem/P2159 数据范围:略. 题解: 不会.... 看了题解觉得自己好傻逼啊
随机推荐
- 「BZOJ 5010」「FJOI 2017」矩阵填数「状压DP」
题意 你有一个\(h\times w\)的棋盘,你需要在每个格子里填\([1, m]\)中的某个整数,且满足\(n\)个矩形限制:矩形的最大值为某定值.求方案数\(\bmod 10^9+7\) \(h ...
- Java内置锁synchronized的实现原理及应用(三)
简述 Java中每个对象都可以用来实现一个同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock). 具体表现形式如下: 1.普通同步方法,锁的是当前实例对象 ...
- Failed to execute goal maven-gpg-plugin 1.5 Sign
问题描述: 解决办法:跳过maven-gpg-plugin <build> <pluginManagement> <plugins> <plugin> ...
- LeetCode 215. 数组中的第K个最大元素(Kth Largest Element in an Array)
题目描述 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 ...
- Qt应用Redis实现消息队列
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/liulihuo_gyh/article/details/78425763 类似BS模式,客户端发 ...
- Qt 互斥量 QMutex
QMutex类提供了一种保护一个变量和一段代码的方法. mutex.lock() //锁住互斥量(mutex).如果互斥量是解锁的,那么当前线程就立即占用并锁定它.否则,当前线程就会被阻塞,知道掌握这 ...
- VC++实现标准型计算器步骤及源码
VC++实现标准型计算器步骤及源码 2013年06月19日 09:48:47 无敌的成长日记 阅读数:4686 最近一段时间一直在做这个东西,刚刚拿到题目的时候认为这是一个简单的程序,可是 ...
- nodejs获取常见疾病数据示例
日常生活中有一些常见的疾病,这个可以通过百度等搜索到,但是如果你要完成一款app或者小程序.网站之类的该如何来获取常见疾病的信息呢?首先想到的是通过爬虫爬取数据,然后整理搜索....其实这种方法还是太 ...
- 一百一十三:CMS系统之前台注册界面
html {% from 'common/_macros.html' import static %}<!DOCTYPE html><html lang="en" ...
- 模型压缩-Learning Efficient Convolutional Networks through Network Slimming
Zhuang Liu主页:https://liuzhuang13.github.io/ Learning Efficient Convolutional Networks through Networ ...