Codeforces 985 最短水桶分配 沙堆构造 贪心单调对列
A
B
/* Huyyt */
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define mkp(a,b) make_pair(a,b)
#define pb push_back
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
using namespace std;
typedef long long ll;
inline void read(int &v)
{
v = ;
char c = ;
int p = ;
while (c < '' || c > '')
{
if (c == '-')
{
p = -;
}
c = getchar();
}
while (c >= '' && c <= '')
{
v = (v << ) + (v << ) + c - '';
c = getchar();
}
v *= p;
}
const long long mod = 1e9 + ;
const int N = 1e5 + ;
int n;
char f[][];
int num[];
int main()
{
int n, m;
cin >> n >> m;
for (int i = ; i <= n; i++)
{
scanf("%s", f[i] + );
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= m; j++)
{
if (f[i][j] == '')
{
num[j]++;
}
}
}
int flag;
for (int i = ; i <= n; i++)
{
flag = ;
for (int j = ; j <= m; j++)
{
if (f[i][j] == '' && num[j] == )
{
flag = ;
break;
}
}
if (flag)
{
cout << "YES" << endl;
return ;
}
}
cout << "NO" << endl;
return ;
}
C
/* Huyyt */
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define mkp(a,b) make_pair(a,b)
#define pb push_back
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
using namespace std;
typedef long long ll;
inline void read(int &v)
{
v = ;
char c = ;
int p = ;
while (c < '' || c > '')
{
if (c == '-')
{
p = -;
}
c = getchar();
}
while (c >= '' && c <= '')
{
v = (v << ) + (v << ) + c - '';
c = getchar();
}
v *= p;
}
const long long mod = 1e9 + ;
const int N = 1e5 + ;
int n;
ll num[N];
priority_queue<ll, vector<ll>, less<ll> >que;
queue<ll> q;
int main()
{
int n, k;
ll l;
ll minn = INT_MAX;
ll anser = ;
cin >> n >> k >> l;
for (int i = ; i <= n * k; i++)
{
scanf("%d", &num[i]);
minn = min(minn, num[i]);
}
int cnt = ;
if (k == )
{
for (int i = ; i <= n * k; i++)
{
if (num[i] > minn + l)
{
cout << << endl;
return ;
}
anser += num[i];
}
cout << anser << endl;
return ;
}
//cout<<minn<<endl;
for (int i = ; i <= n * k; i++)
{
if (num[i] <= minn + l)
{
que.push(num[i]);
}
else
{
q.push(num[i]);
}
}
while (n--)
{
for (int i = ; i <= k - ; i++)
{
if (que.empty())
{
cout << << endl;
return ;
}
if (q.empty())
{
if (que.size() > )
{
//cout<<que.top()<<endl;
que.pop();
}
else
{
cout << << endl;
return ;
}
}
else
{
//cout<<q.front()<<endl;
q.pop();
}
}
//cout<<que.top()<<endl;
ll now = que.top();
que.pop();
//cout<<endl;
if (now > minn + l)
{
cout << << endl;
return ;
}
else
{
anser += now;
}
}
cout << anser << endl;
return ;
}
D. Sand Fortress
给你N高度的沙子 要求你堆出刚好N高度的沙子 相邻的两个沙子差距不超过1 第一堆沙子不超过H
解:
①
官方题解:
先考虑金字塔型1到K到1 这样得到的总数为k*(k+1)/2-k=k2
然后我们贪心把剩下的n-k2都用k来放 再需要用的总数就是
可以证明对于任意k从2到
这个函数从1开始是递增的

然后贪心地把金字塔尽量往左移 即让初始的h1=min(k,H)
则左移后的沙子总数为 
所以我们需要做的是找到最大的k使得当h1=min(k,H)时 
当恰好为n时 不用补充 小于n时 用k去补充
#include <bits/stdc++.h> #define forn(i, n) for (int i = 0; i < int(n); i++) typedef long long li; using namespace std; const int INF = 2e9;
li n, h; bool check(li maxh){
li k = min(h, maxh);
li cnt = maxh * maxh - k * (k - ) / ;
return (cnt <= n);
} li get(li maxh){
li k = min(h, maxh);
li cnt = maxh * maxh - k * (k - ) / ;
li len = ( * maxh - ) - (k - );
n -= cnt;
return len + (n + maxh - ) / maxh;
} int main() {
scanf("%lld%lld", &n, &h);
li l = , r = INF; while (l < r - ){
li m = (l + r) / ; if (check(m))
l = m;
else
r = m;
} printf("%lld\n", check(r) ? get(r) : get(l));
return ;
}
②(和官方差不多)
构造两种
第一种为三角形 第二种为梯形
两种分别二分构造 然后取最小值即可
E. Pencils and Boxes
给你一个N个数字的数组,要求你把每个数字都放入一个盒子
每个数字只属于一个盒子 每个盒子至少要有K个数字 每个盒子的极差不超过d
能实现的话YES 否则NO
解:
贪心 单调队列
先排序 然后贪心 很容易想到一个盒子里能放多少连续的就尽量放多少
通过单调队列实现能放多少尽量放多少的操作
/* Huyyt */
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
#define mkp(a,b) make_pair(a,b)
#define pb push_back
const int dir[][] = {{, }, {, }, {, -}, { -, }, {, }, {, -}, { -, -}, { -, }};
using namespace std;
typedef long long ll;
inline void read(int &v)
{
v = ;
char c = ;
int p = ;
while (c < '' || c > '')
{
if (c == '-')
{
p = -;
}
c = getchar();
}
while (c >= '' && c <= '')
{
v = (v << ) + (v << ) + c - '';
c = getchar();
}
v *= p;
}
const long long mod = 1e9 + ;
const int N = 5e5 + ;
int n;
int num[N];
int q[N];
int main()
{
int k, d;
read(n), read(k), read(d);
for (int i = ; i <= n; i++)
{
read(num[i]);
}
int now;
sort(num + , num + + n);
int head = ;
int tail = ;
for (int i = k; i <= n; i++)
{
while (head <= tail && num[i] - num[q[head] + ] > d)
{
head++;
}
if (head <= tail && i - q[head] >= k)
{
q[++tail] = i;
}
}
if (q[tail] == n)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
return ;
}
F
Codeforces 985 最短水桶分配 沙堆构造 贪心单调对列的更多相关文章
- Codeforces Global Round 9 B. Neighbor Grid (构造,贪心)
题意:给一个\(n\)X\(m\)的矩阵,矩阵中某个数字\(k\)表示其四周恰好有\(k\)个不为0的数字,你可以使任意位置上的数字变大,如果操作后满足条件,输出新矩阵,否则输出NO. 题解:贪心,既 ...
- BZOJ1233 [Usaco2009Open]干草堆tower[贪心+单调队列优化]
地址 注意思路!多看几遍! 很巧妙的一道题.不再是决策点以dp值中一部分含j项为维护对象,而是通过维护条件来获取决策. 首先有个贪心策略,让底层的宽度尽可能小,才能让高度尽可能高.所以应该倒着dp,表 ...
- 《MORE EFFECTIVE C++》条款27 要求或者禁止对象分配在堆上
1. 要求对象分配在堆上 临时对象一般是存在于栈中的,或者是静态对象存在于常量存储区的.那么当创建一个这样的对象的时候,一般是需要隐式或显式地调用构造函数,在销毁的时候调用析构函数的.可以从这方面入手 ...
- new 的对象如何不分配在堆而分配在栈上(方法逃逸等)
当能够明确对象不会发生逃逸时,就可以对这个对象做一个优化,不将其分配到堆上,而是直接分配到栈上,这样在方法结束时,这个对象就会随着方法的出栈而销毁,这样就可以减少垃圾回收的压力. 如方法逃逸. 逃逸分 ...
- iOS开发中的内存分配(堆和栈)
进程的内存分区 所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内存是事先 ...
- (转)在.NET程序运行过程中,什么是堆,什么是栈?什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
转自:http://www.cnblogs.com/xiaoyao2011/archive/2011/09/09/2172427.html 在.NET程序运行过程中,什么是堆,什么是栈? 堆也就是托管 ...
- C++内存分配与对象构造的分离
在C++中,我们基本用new(delete)操作符分配(释放)内存.new操作符为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类 ...
- experiment : 在私有堆和默认进程堆中, 测试能分配的堆空间总和, 每次能分配的最大堆空间
实验环境: Win7X64Sp1 + vs2008, 物理内存16GB. 实验结论: * 进程堆的最大Size并没有使用完剩余的物理内存 * 每次能分配的最大堆空间接近2M, 不管是私有堆 ...
- Python标准库模块之heapq – 堆构造
Python标准库模块之heapq – 堆构造 读前福利:几百本经典书籍https://www.johngo689.com/2158/ 原文链接:https://www.johngo689.com/2 ...
随机推荐
- LeetCode 516——最长回文子序列
1. 题目 2. 解答 与最长回文子串类似,我们可以用动态规划来求解这个问题,只不过这里的子序列可以不连续.我们定义状态 state[i][j] 表示子串 s[i, j] 的最长回文子序列长度,那么状 ...
- redhat下配置SEED DVS6446开发环境2
---恢复内容开始--- 1.rpcbind步骤 linux包:portmap安装包 libgssglue-0.1-8.1.el6.i686.rpm libtirpc-0.2.1-1.el6.i68 ...
- samba安装应用实例-1
应用实例:先安装samba软件,yum install -y samba1.需求:共享一个目录,任何人都可以访问,不用输密码,只读.(1)首先打开samba配置文件/etc/samba/smb.con ...
- MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)
背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有子节点(包含路径上的枝干节点和叶子节点) 枝干节点:如果一个节点下还有子节点,则为枝干节点. 叶子节点:如果一个节点下不再有子节点 ...
- 在Spring容器外调用bean
这个东西源于这种需求:一个应用丢到服务其后,不管用户有没有访问项目,这个后台线程都必须给我跑,而且这个线程还调用了Spring注入的bean,这样自然就会想到去监听Servlet的状态,当Servle ...
- javascript中几种为false的值
如果JavaScript预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值.转换规则是除了下面六个值被转为false,其他值都视为true. undefined null false 0 ...
- 【HANA系列】SAP HANA XS创建XSJOB后台执行
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS创建XSJ ...
- 描述什么是springboot
Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作<Expert One-On-One J2EE Developme ...
- 【Ruby on Rails 学习四】简单的代码快和错误处理
第一个例子: 1 ... 5000的加法运算 1 sum = 0 2 i = 1 3 while true 4 sum += i 5 i += 1 6 break if i == 5001 7 end ...
- 2 Java中常见集合
1)说说常见的集合有哪些吧? 答:集合有两个基本接口:Collection 和 Map. Collection 接口的子接口有:List 接口.Set 接口和 Queue 接口: List 接口的实现 ...