CodeForces 670D2 Magic Powder - 2(二分+贪心)
2016-05-07 12:35
525 查看
http://codeforces.com/contest/670/problem/D2
简单的二分,二分所有可以做的饼干数,然后遍历就可以啦
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long LL;
#define N 210000
#define INF 0x3f3f3f3f
#define met(a, b) memset (a, b, sizeof(a))
struct node
{
LL one, sum;///做一个饼干需要的材料和已经有的材料
LL num, need;///当前材料可以做的饼干数和做剩下的材料
}p
;
bool cmp (node a, node b)
{
return a.num < b.num;
}
LL n, k, L, R;
LL Search ()
{
LL l = L, r = R, maxn = 0;
while (l<=r)
{
LL mid = (l+r)/2, S = 0;
for (int i=0; i<n; i++)
{
if (p[i].num < mid)
{
S += p[i].one-p[i].need;
if (mid>p[i].num)
S += (mid-1-p[i].num)*p[i].one;
if (S > k) break;///第一次没加上这个判断条件WA在第128组测试数据上了
}
}
if (S <= k)
{
maxn = max (maxn, mid);
l = mid+1;
}
else r = mid-1;
}
return maxn;
}
void Solve ()
{
sort (p, p+n, cmp);
L = R = p[0].num;
for (int i=0; i<n; i++)
R = max (R, (k+p[i].need)/p[i].one+p[i].num);
LL ans = Search();
printf ("%I64d\n", ans);
}
int main ()
{
while (scanf ("%I64d %I64d", &n, &k) != EOF)
{
met (p, 0);
for (int i=0; i<n; i++)
scanf ("%I64d", &p[i].one);
for (int i=0; i<n; i++)
{
scanf ("%I64d", &p[i].sum);
p[i].num = p[i].sum / p[i].one;
p[i].need = p[i].sum % p[i].one;
}
Solve ();
}
return 0;
}
简单的二分,二分所有可以做的饼干数,然后遍历就可以啦
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long LL;
#define N 210000
#define INF 0x3f3f3f3f
#define met(a, b) memset (a, b, sizeof(a))
struct node
{
LL one, sum;///做一个饼干需要的材料和已经有的材料
LL num, need;///当前材料可以做的饼干数和做剩下的材料
}p
;
bool cmp (node a, node b)
{
return a.num < b.num;
}
LL n, k, L, R;
LL Search ()
{
LL l = L, r = R, maxn = 0;
while (l<=r)
{
LL mid = (l+r)/2, S = 0;
for (int i=0; i<n; i++)
{
if (p[i].num < mid)
{
S += p[i].one-p[i].need;
if (mid>p[i].num)
S += (mid-1-p[i].num)*p[i].one;
if (S > k) break;///第一次没加上这个判断条件WA在第128组测试数据上了
}
}
if (S <= k)
{
maxn = max (maxn, mid);
l = mid+1;
}
else r = mid-1;
}
return maxn;
}
void Solve ()
{
sort (p, p+n, cmp);
L = R = p[0].num;
for (int i=0; i<n; i++)
R = max (R, (k+p[i].need)/p[i].one+p[i].num);
LL ans = Search();
printf ("%I64d\n", ans);
}
int main ()
{
while (scanf ("%I64d %I64d", &n, &k) != EOF)
{
met (p, 0);
for (int i=0; i<n; i++)
scanf ("%I64d", &p[i].one);
for (int i=0; i<n; i++)
{
scanf ("%I64d", &p[i].sum);
p[i].num = p[i].sum / p[i].one;
p[i].need = p[i].sum % p[i].one;
}
Solve ();
}
return 0;
}
相关文章推荐
- VIrtualBox中设置CentOS6.7共享文件夹
- CodeForces 584C Marina and Vasya
- 路由器有线无法上网,此计算机上缺少一个或多个网络协议——解决方法
- virtualbox不能安装64位系统
- [javaSE] 网络编程(TCP通信)
- MySql 安装出错
- ubuntu SDK 安装
- 【轮子介绍】android图片加载库:Glide的简单介绍
- UVA62401背包,滚动数组,并打印路径
- 信息安全中的安全服务问题
- 飛飛(三十七)时间类,时间表(完整版)
- c语言不使用加号实现两个数的相加
- Android Studio 2.0 模拟器新功能介绍
- Bin & Jing in wonderland(概率,组合数学)
- EditText可编辑状态和不可编辑状态切换 及其它特殊效果
- JSTL标签库:out标签
- 图像增强之——同态滤波
- GitHub学习笔记(更新中)
- 你是否愿意相信命运?
- 你是否愿意相信命运?