hiho1362 修补木桶
2016-09-03 20:41
239 查看
/*
最小值最大用二分,枚举起点,二分答案,判断答案是否合法
因为L*M<N,每选L次起点,判断需要修补的最小值,如果比M小
答案可以更大一点,如果比M大,答案小一点
*/
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100000000
int a[1010];
int L,M,N;
int bsol(int x)
{
int num=0;
for(int i=0;i<N;i++)
{
if(a[i]<x)
{
num++;
i+=(L-1);
}
}
return num;
}
int main()
{
cin>>N>>M>>L;
for(int i=0;i<N;i++)
cin>>a[i];
int l=0,r=maxn;
while(l<=r)
{
int mid=(l+r)>>1;
int num=100000;
for(int i=0;i<L;i++)
{
for(int j=0;j<N-1;j++)
swap(a[j],a[j+1]);//枚举起点
num=min(num,bsol(mid));
}
if(num<=M)
l=mid+1;
else
r=mid-1;
}
cout<<r<<endl;
}
最小值最大用二分,枚举起点,二分答案,判断答案是否合法
因为L*M<N,每选L次起点,判断需要修补的最小值,如果比M小
答案可以更大一点,如果比M大,答案小一点
*/
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100000000
int a[1010];
int L,M,N;
int bsol(int x)
{
int num=0;
for(int i=0;i<N;i++)
{
if(a[i]<x)
{
num++;
i+=(L-1);
}
}
return num;
}
int main()
{
cin>>N>>M>>L;
for(int i=0;i<N;i++)
cin>>a[i];
int l=0,r=maxn;
while(l<=r)
{
int mid=(l+r)>>1;
int num=100000;
for(int i=0;i<L;i++)
{
for(int j=0;j<N-1;j++)
swap(a[j],a[j+1]);//枚举起点
num=min(num,bsol(mid));
}
if(num<=M)
l=mid+1;
else
r=mid-1;
}
cout<<r<<endl;
}
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 快速排序里的学问:从猜数字开始
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833