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 621 任务调度器 Task Scheduler
给定一个用字符数组表示的 CPU 需要执行的任务列表.其中包含使用大写的 A - Z 字母表示的26 种不同种类的任务.任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完.CPU 在 ...
- 折腾ELK+kafka+zk
回顾前大半年: 1.kubespray搭建K8S集群 2.openVPN 搭建 3.helm使用 4.aws EKS 搭建维护 5.Jenkins pipline 编写ci/cd流程 6.蓝鲸,jum ...
- 根据md5去重文件
import os import hashlib def get_md5(file): file = open(file,'rb') md5 = hashlib.md5(file.read()) fi ...
- django写原生sql语句
执行自定义SQL语言: from django.db import connection cursor=connection.cursor() # 插入操作 cursor.execute(&q ...
- nmon服务器监控工具的使用安装
nmon是一个监控服务器性能的工具 目录 1.安装nmon 2.数据采集 1.安装nmon nmon是一种linux服务器性能监控工具,他还提供了很好的图表结果展示功能.本篇以centos6.5系统为 ...
- jeecms v9图标不显示问题
- nginx配置thinkphp项目(nginx下去掉index.php)
server { listen 80; server_name xxxxx; root "/www/public"; location / { index index.html i ...
- HDU 1159 Common Subsequence (动态规划、最长公共子序列)
Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- MySQL -2- 体系结构--随笔小记
简介与安装NoSQLRDBMS版本安装方式二进制安装,源码安装体系结构CS模型TCP/IPsocketmysql master thread 实例mysqld 的程序构成连接层 协议.验证.链接线程S ...
- Spark中的术语图解总结
参考:http://www.raincent.com/content-85-11052-1.html 1.Application:Spark应用程序 指的是用户编写的Spark应用程序,包含了Driv ...