bzoj 1293: [SCOI2009]生日礼物
2017-07-13 00:56
399 查看
1293: [SCOI2009]生日礼物
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2380 Solved: 1290
[Submit][Status][Discuss]
Description
小西有一条很长的彩带,彩带上挂着各式各样的彩珠。已知彩珠有N个,分为K种。简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置)。某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上。 小布生日快到了,于是小西打算剪一段彩带送给小布。为了让礼物彩带足够漂亮,小西希望这一段彩带中能包含所有种类的彩珠。同时,为了方便,小西希望这段彩带尽可能短,你能帮助小西计算这个最短的长度么?彩带的长度即为彩带开始位置到结束位置的位置差。Input
第一行包含两个整数N, K,分别表示彩珠的总数以及种类数。接下来K行,每行第一个数为Ti,表示第i种彩珠的数目。接下来按升序给出Ti个非负整数,为这Ti个彩珠分别出现的位置。Output
应包含一行,为最短彩带长度。Sample Input
6 31 5
2 1 7
3 1 3 8
Sample Output
3暴力枚举起点
对于每个起点,所有种类的宝珠都找在这个起点后面且离起点最近的就好
具有单调性,代码一看就懂
#include<stdio.h> #include<functional> #include<queue> #include<algorithm> using namespace std; priority_queue<int, vector<int>, greater<int> > q[66]; int main(void) { int n, m, i, k, x, ans, len; while(scanf("%d%d", &n, &m)!=EOF) { for(i=0;i<=m;i++) { while(q[i].empty()==0) q[i].pop(); } for(i=1;i<=m;i++) { scanf("%d", &k); while(k--) { scanf("%d", &x); q[i].push(x); q[0].push(x); } } ans = 2147483647; while(q[0].empty()==0) { x = q[0].top(); q[0].pop(); len = 0; for(i=1;i<=m;i++) { while(q[i].empty()==0 && q[i].top()<x) q[i].pop(); if(q[i].empty()) break; len = max(len, q[i].top()-x); } if(i<=m) break; ans = min(ans, len); } printf("%d\n", ans); } return 0; }
相关文章推荐
- BZOJ 1293 [SCOI2009] 生日礼物 题解与分析
- 【BZOJ】【1293】【SCOI2009】生日礼物
- BZOJ 1293 [SCOI2009] 生日礼物
- [BZOJ1293][SCOI2009]生日礼物-堆
- bzoj 1293: [SCOI2009]生日礼物
- BZOJ 1293: [SCOI2009]生日礼物
- BZOJ 1293: [SCOI2009]生日礼物 链表模拟
- bzoj 1293: [SCOI2009]生日礼物 STL
- [BZOJ 1293] SCOI 2009 生日礼物 · 单调队列
- 【BZOJ1293】【SCOI2009】生日礼物 单调性
- bzoj 1293: [SCOI2009]生日礼物
- [BZOJ 1293][SCOI2009]生日礼物:单调队列
- 【BZOJ】1293 [SCOI2009]生日礼物 (这题有多种解法)
- 【堆】bzoj1293 [SCOI2009]生日礼物
- [BZOJ] 1293 - [SCOI2009] - 生日礼物 - 离散化 - 尺取法 - 状态压缩
- BZOJ 1293 SCOI2009 生日礼物 堆
- 【BZOJ1293】【SCOI2009】生日礼物
- bzoj 1293: [SCOI2009]生日礼物 (单调队列)
- BZOJ1293: [SCOI2009]生日礼物
- 【bzoj 1293】[SCOI2009] 生日礼物 指针维护队列