您的位置:首页 > 编程语言 > C语言/C++

洛谷二分答案

2017-12-24 14:38 204 查看

洛谷二分答案

目前难度:普及+/提高-

详解见二分答案

目录

洛谷二分答案
P1316 丢瓶盖

P1396 营救

P2920 USACO08NOV时间管理Time Management

P2183 巧克力

P1902 刺杀大使
手写队列

stl

P1316 丢瓶盖

用时: 264ms / 内存: 2968KB

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define L long long
using namespace std;
int n,m;
L a[100001];
L read()
{
char c=getchar();
L t=0;
while(c>'9'||c<'0') c=getchar();
while(!(c>'9'||c<'0'))
t=(t<<3)+(t<<1)+c-'0',c=getchar();
return t;
}
bool ju(int s)
{
int t=1,c=1;
for(int i=2;i<=n;++i)
{
if(a[i]-a[t]>=s) {++c;t=i;}
if(c==m) return 1;
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
a[i]=read();
sort(a+1,a+1+n);
L l=0,r=1000000000;
while(l<=r)
{
int mid=l+r>>1;
if(ju(mid))
l=mid+1;
else
r=mid-1;
}
cout<<l-1;
return 0;
}


P1396 营救

用时: 12ms / 内存: 2554KB

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,s,e,ro;
int f[40005];
struct $
{
int ne,c,t;
}a[40005];
void road(int x,int y,int c)
{
a[++ro].t=y;
a[ro].c=c;
a[ro].ne=f[x];
f[x]=ro;
}
bool ju(int z)
{
int q[20002]={0};//哈哈哈哈哈
bool v[10001]={0};
int he=0,ta=1;
q[ta]=s;
while(he<ta)
{
int x=q[++he];
if(x==e) return 1;
v[x]=1;
for(int i=f[x];i;i=a[i].ne)
{
int t1=a[i].t;
if(v[t1]||a[i].c>z) continue;
q[++ta]=t1;
}
}
return 0;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&s,&e);
for(int i=1;i<=m;++i)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
road(x,y,z);road(y,x,z);
}
int l=1,r=10005;
while(l<=r)
{
int mid=l+r>>1;
ju(mid)?r=mid-1:l=mid+1;
}
printf("%d\n",r+1);
return 0;
}


P2920 [USACO08NOV]时间管理Time Management

用时: 0ms / 内存: 2257KB

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
struct $
{
int c,t;
bool operator <(const $&b)const
{
return t<b.t;
}
}a[1001];
bool ju(int s)
{
int t1=s;
for(int i=1;i<=n;++i)
if(a[i].c+t1<=a[i].t) t1+=a[i].c;
else return 0;
return 1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d%d",&a[i].c,&a[i].t);
sort(a+1,a+1+n);
int l=0,r=1000000;
while(l<=r)
{
int mid=l+r>>1;
ju(mid)?l=mid+1:r=mid-1;
}
p
c9f8
rintf("%d",l-1);
return 0;
}


P2183 巧克力

用时: 0ms / 内存: 2125KB

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,a[5001];
bool ju(int s)
{
int c=0;
for (int i = 1; i <=n; ++i)
{
c+=a[i]/s;
if(c>=m) return 1;
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i = 1; i <=n; ++i)
scanf("%d",&a[i]);
int l=1,r=10001;
while(l<=r)
{
int mid=l+r>>1;
ju(mid)?l=mid+1:r=mid-1;
}
printf("%d\n",l-1);
return 0;
}


P1902 刺杀大使

手写队列

用时: 1316ms / 内存: 14597KB

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,a[1001][1001];
int d[5][2]={{0,0},{-1,0},{1,0},{0,-1},{0,1}};
int q[1000002][2];//哈哈哈哈哈
bool v[1001][1001];
bool ju(int s)
{
int he=0,ta=1,ma=-1;
bool flag=1;
memset(v,0,sizeof(v));
memset(q,0,sizeof(q));
q[1][0]=q[1][1]=1;
v[1][1]=1;
while(he<ta)
{
int x=q[++he][0],y=q[he][1];
if(x==n) {flag=0;break;}
for(int k=1;k<=4;k++)
{
int i=x+d[k][0],j=y+d[k][1];
if(i<1||j<1||i>n||j>m) continue;
if(a[i][j]>s||v[i][j]) continue;
v[i][j]=1;
ma=max(a[i][j],ma);
q[++ta][0]=i;
q[ta][1]=j;
}
}
if(flag) return 0;
return ma>s?0:1;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
int l=0,r=1001;
while(l<=r)
{
int mid=l+r>>1;
ju(mid)?r=mid-1:l=mid+1;
}
printf("%d\n",r+1);
return 0;
}


stl

用时: 1700ms / 内存: 7031KB

#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
int n,m,a[1001][1001];
int d[5][2]={{0,0},{-1,0},{1,0},{0,-1},{0,1}};
struct $
{
int x,y;
};
queue<$>q;
bool v[1001][1001];
bool ju(int s)
{
int ma=-1;
bool flag=1;
memset(v,0,sizeof(v));
q.push(($){1,1});
v[1][1]=1;
while(!q.empty())
{
$ t1=q.front();q.pop();
if(t1.x==n) {flag=0;break;}
for(int k=1;k<=4;k++)
{
int i=t1.x+d[k][0],j=t1.y+d[k][1];
if(i<1||j<1||i>n||j>m) continue;
if(a[i][j]>s||v[i][j]) continue;
v[i][j]=1;
ma=max(a[i][j],ma);
q.push(($){i,j});
}
}
while(!q.empty()) q.pop();
if(flag) return 0;
return ma>s?0:1;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
int l=0,r=1001;
while(l<=r)
{
int mid=l+r>>1;
ju(mid)?r=mid-1:l=mid+1;
}
printf("%d\n",r+1);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 二分