51 nod 1521 一维战舰(二分)
2024-10-20 07:39:49
传送门
题意
分析
这是我在51nod上的第2题,下载了4个数据,得不偿失?我太菜啦
一开始wa了6个点,下数据后发现舰与舰不能相邻,再交wa,发现l和r都没设好,再wa,发现check里面[1,b[1]]的判断写错了QAQ
此题二分[1,m],每次将[1,mid]的数排序,计算可放舰的数量,与k比较
trick
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k,len;
int m;
int a[200200],b[200200];
int check(int loc)
{
int cnt=0;
for(int i=1;i<=loc;++i) b[i]=a[i];
sort(b+1,b+1+loc);
//for(int i=1;i<=loc;++i) printf("%d%c",b[i],i==loc?'\n':' ');
for(int i=2;i<=loc;++i)
{
if(b[i]-b[i-1]-1<len) continue;
cnt+=(b[i]-b[i-1])/(len+1);
}
cnt+=(b[1])/(len+1);
if((n-b[loc])>=len) cnt+=(n-b[loc]+1)/(len+1);
//printf("loc=%d cnt=%d\n",loc,cnt);
return cnt>=k;
}
int main()
{
freopen("51nod_Problem_1521_Test_15_In.txt","r",stdin);
scanf("%d %d %d",&n,&k,&len);
scanf("%d",&m);
for(int i=1;i<=m;++i) scanf("%d",a+i);
//sort(a+1,a+1+m);
int l=1,r=m;
while(l+1<r)
{
int mid=(l+r)>>1;
if(check(mid)) l=mid+1;else r=mid;
}
//if(check(l)) printf("%d\n",l);else printf("%d\n",r);
//int mid=(l+r)>>1;
//printf("l=%d r=%d\n",l,r);
if(check(l)==0) printf("%d\n",l);
else if(check(r)==0) printf("%d\n",r);
else if(r<m) printf("%d\n",r+1);
else puts("-1");
return 0;
}
最新文章
- Java Maps的9个常见问题
- SCCM 客户端的修复
- JAVA中保留指定小数位方法
- mvc 分页js
- DemoExample
- ANDROID_MARS学习笔记_S01原始版_001_Intent
- Oauth认证简介
- MVC三层架构编程(Dao、service、servlet 之间的关系)
- [转]Installing Snow Leopard (Client) on VMware Fusion 6.0.3
- angular学习(五)-- Module
- Spring中AOP简介与切面编程的使用
- opencv源码学习: getGaussianKernel( 高斯核);
- 【Java】 剑指offer(8) 用两个栈实现队列
- 检查jdk版本
- EsayUI + MVC + ADO.NET(工作单元)
- Spring中property-placeholder的使用与解析
- oracle一些笔记
- Linux下Rsync+Inotify-tools实现数据实时同步
- TryParse用法
- Web界面设计(Designing Web Interfaces中文版) (美)斯科特 pdf扫描版​
热门文章
- 【Objective-C】09-空指针和野指针
- <;bgsound>; - 背景音乐
- UVA 11246 - K-Multiple Free set(数论推理)
- poj1703 Find them,Catch them 【并查集】
- ConcurrentHashMap源代码解析
- 程序设计之另一种读写函数---writev,readv
- Android实现RecyclerView的下拉刷新和上拉载入很多其它
- String,StringBuilder与StringBuffer的区别
- 使用tencent协议发起临时会话
- phpexcel导出后乱码或者是打不开文件必须修复的问题