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 ...
随机推荐
- 1.3 Junit4简介
1.Junit4框架 可用于单元测试,直接测试类中的方法 2.简单实用 a.导入Junit的jar包 b.熟悉Junit的执行顺序 c.写测试用例 d.利用断言,找bug 3.demo public ...
- vue问题三:element ui的upload组件上传图片成功和移除事件
element ui的upload组件上传图片成功和移除事件: 登录后获取到后台传的token存到中: sessionStorage.setItem("token",data.ob ...
- Git-Runoob:Git 标签
ylbtech-Git-Runoob:Git 标签 1.返回顶部 1. Git 标签 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签. 比如说,我 ...
- Python之 反射、迭代器、生成器
反射 反射就是通过 内置函数getattr() 以字符串的形式导入模块,以字符串的形式调用模块/对象里方法 l=['add','del','set','find'] for i in l: print ...
- Maven POM 模板[z]
https://juejin.im/post/5cc826a5f265da03a33c443a [z]https://juejin.im/post/5cc826a5f265da03a33c443a S ...
- Python中常见的异常总结
Python中常见的异常总结 当Python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常. 一.异常错误 a.语法错误 错误一: if ...
- Java基础面试题集(一)
Java基础面试题 一.面向对象编程(OOP) 7 二.常见的Java问题 7 2.1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? 7 2.2.JDK和JRE的区别是什么? ...
- Docker 镜像的操作
1. 从docker 镜像仓库获取镜像 docker pull [镜像名] 从 docker hub 中查看版本 获取 特定版本 docker pull centos 7.6.1801 2. ...
- (转)在Kubernetes集群中使用JMeter对Company示例进行压力测试
背景 压力测试是评估应用性能的一种有效手段.此外,越来越多的应用被拆分为多个微服务而每个微服务的性能不一,有的微服务是计算密集型,有的是IO密集型. 因此,压力测试在基于微服务架构的网络应用中扮演着越 ...
- 修改Docker0网桥默认网段
Docker--修改Docker0网桥默认网段 修改文件 /etc/docker/daemon.json 添加内容 "bip": "ip/netmask" [ ...