51nod1821 最优集合 贪心

首先考虑一个集合的最大优美值怎么求出
考虑新增一个数,假设我们现在的优美值已经达到了$V$,那么只需要一个$[1, V + 1]$的数就可以使$V$达到更大
为了保证能添加尽可能多的数进来,我们这么构造:
对集合$S$排序,从小到大选择,直到选到$\sum\limits_{i = 1}^{j}v[j] + 1 < v[j]$的$v[j]$,退出
为什么这么做正确呢?
如果不正确,只可能存在一个数$S$可以被大于一个数的和表示,并且满足$v[S] > V + 1$
其中$v[S]$表示构成$S$的所有$v$,$V$表示现在选出的和
由于整数的离散性,因此,一定有$v[S] \leqslant V + 1$,所以不可能不正确...
(很sb的证明....)
现在有两个集合了
只要进行这么一种操作$k$次就好了,记$W$表示从$S2$中选出的数的和,$S$表示目前$S1$中选出的数的和
1.找出使得$\sum\limits_{i = 1}^{k - 1} v[i] + W + 1 < v[k]$成立的最大的$k$,令$S = \sum\limits_{i = 1}^{k - 1} v[i]$
2.再找出最大的且没有被选择的$j$使得$v[j] \leqslant W + S + 1$成立,之后选择$j$,$W += v[j]$,拿个栈维护即可
重复$k$次即可得出最后的结果
复杂度$O(Tm)$
注:那个㧟我快读的人拿rk3~~有猫病~~.....
注2:反正我还是rk1
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; extern inline char gc() {
static char RR[], *S = RR + , *T = RR + ;
if(S == T) fread(RR, , , stdin), S = RR;
return *S ++;
}
inline int read() {
int p = , w = ; char c = gc();
while(c > '' || c < '') { if(c == '-') w = -; c = gc(); }
while(c >= '' && c <= '') p = p * + c - '', c = gc();
return p * w;
} int wr[], rw;
#define pc(x) *O ++ = x
char WR[], *O = WR;
inline void write(long long x) {
if(!x) pc('');
if(x < ) x = -x, pc('-');
while(x) wr[++ rw] = x % , x /= ;
while(rw) pc(wr[rw --] + ''); pc('\n');
} #define sid 1005
#define ri register int
#define ll long long int n, T, tt;
int num[sid], q[sid], S[sid][sid]; int main() {
n = read();
for(ri i = ; i <= n; i ++) {
num[i] = read();
for(ri j = ; j <= num[i]; j ++) S[i][j] = read();
sort(S[i] + , S[i] + num[i] + );
}
T = read();
for(ri i = ; i <= T; i ++) {
int a = read(), b = read(), k = min(read(), num[b]);
int *A = S[a], *B = S[b];
ll ans = ; ri ia = , ib = ; tt = ;
while(k) {
while(A[ia] <= ans + && ia <= num[a]) ans += A[ia], ia ++;
while(B[ib] <= ans + && ib <= num[b]) q[++ tt] = B[ib], ib ++;
if(!tt) break; ans += q[tt --]; k --;
}
while(A[ia] <= ans + && ia <= num[a]) ans += A[ia], ia ++;
write(ans);
}
fwrite(WR, , O - WR, stdout);
return ;
}
51nod1821 最优集合 贪心的更多相关文章
- 51NOD 1821 最优集合 栈
1821 最优集合 一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2, ...
- 51nod1821-最优集合【贪心】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1821 题目大意 \(n\)个可重集合,\(T\)次询问,询问将集合\(S ...
- CF 672C Recycling Bottles[最优次优 贪心]
C. Recycling Bottles time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- 51NOD 1821 最优集合 [并查集]
传送门 题意: 一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个 ...
- 51nod 1821 最优集合(思维+单调队列)
题意:一个集合S的优美值定义为:最大的x,满足对于任意i∈[1,x],都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求 ...
- 51Nod - 1821:最优集合 (求第一个不能被表示为多个数的和的数)(不错的动脑题)
一个集合S的优美值定义为:最大的x,满足对于任意i∈1,x1,x,都存在一个S的子集S',使得S'中元素之和为i. 给定n个集合,对于每一次询问,指定一个集合S1和一个集合S2,以及一个数k,要求选择 ...
- 胡小兔的OI日志3 完结版
胡小兔的 OI 日志 3 (2017.9.1 ~ 2017.10.11) 标签: 日记 查看最新 2017-09-02 51nod 1378 夹克老爷的愤怒 | 树形DP 夹克老爷逢三抽一之后,由于采 ...
- 【learning】加权拟阵与贪心
首先.. 这篇东西的话算是一个关于拟阵部分知识的小总结,有些语言相对来说偏向便于理解方面,所以可能..有一些说法会不是那么严谨大概是这样 一些概念 线性无关:一组数据中没有一个量可以写成其余量的线 ...
- 1572: [Usaco2009 Open]工作安排Job[贪心]
Description Farmer John 有太多的工作要做啊!!!!!!!!为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有1000000000个单 ...
随机推荐
- amcharts的一些用法
function chartdiv2() { var chart; var chartData = [ { "month" : "2015-08", " ...
- iOS静态库 ---iOS-Apple苹果官方文档翻译
iOS静态库 ---iOS-Apple苹果官方文档翻译 •什么是库? 库是共享程序代码的方式,一般分为静态库和动态库.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使⽤用就为什 ...
- lintcode 443.岛屿的个数
在v2ex上看到有人提到了这个,感觉挺简单的,没忍住还是试一下.... 基本的染色法. AC代码: public class Solution { /** * @param grid a boolea ...
- 向量与矩阵的范数及其在matlab中的用法(norm)
一.常数向量范数 \(L_0\) 范数 \(\Vert x \Vert _0\overset{def}=\)向量中非零元素的个数 其在matlab中的用法: sum( x(:) ~= 0 ) \(L_ ...
- PHP文本式留言板——php经典实例
文件结构: index.php 主页和添加页 show.php 查看留言页 ly.db 文本保存页 doAdd.php 添加功能页 doDel.php 删除功能页 index.php <htm ...
- python基础===15条变量&方法命名的最佳实践
不同的代码段采用不同的命名长度.通常来说,循环计数器(loop counters)采用1位的单字符来命名,循环判断变量(condition/loop variables)采用1个单词来命名,方法采用1 ...
- USB 3.0传输规格
通用序列总线(USB) 从1996问世以来,一统个人电脑外部连接界面,且延伸至各式消费性产品,早已成为现代人生活的一部分.2000年发表的USB 2.0 High-speed规格,提供了480Mbps ...
- ahttp
# -*- coding: utf-8 -*- # @Time : 2018/8/20 14:35 # @Author : cxa # @File : chttp.py # @Software: Py ...
- Codeforces Round #456 (Div. 2)
Codeforces Round #456 (Div. 2) A. Tricky Alchemy 题目描述:要制作三种球:黄.绿.蓝,一个黄球需要两个黄色水晶,一个绿球需要一个黄色水晶和一个蓝色水晶, ...
- AWS 使用总结
A.升配置的流程: 1.新开一台配置较高的机器; 2.将新机器和老机器的磁盘都取消关联,注意需要记录下老机器的磁盘分区设备名,如:/dev/sda1: 3.将老机器的磁盘挂载到新机器上,磁盘分区设备名 ...