洛谷二分答案
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; }
相关文章推荐
- 洛谷 P3407 散步 (二分答案+判定 或 模拟)
- 洛谷p1902 二分答案 +bfs
- 记录个人在洛谷试练场做题历程:二分答案:膨胀的木棍
- (洛谷 3道题二分答案)1843 1873 2440
- [洛谷1462 ]通往奥格瑞玛的道路---二分答案+spfa
- 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)
- [NOIP2015提高&洛谷P2678]跳石头 题解(二分答案)
- 洛谷P1084:疫情控制 (二分答案+倍增+贪心)
- 洛谷P2824:[HEOI2016]排序 (二分答案+线段树)
- 洛谷 1083||NOIP 2012 借教室 二分答案+差分 解题报告
- 【BZOJ 4326】运输计划【树链剖分+差分+二分答案】
- Gym - 101490E Charles in Charge【最短路+二分答案】
- POJ 2112 Optimal Milking 二分答案+最大流
- Leetcode 4 Median of Two Sorted Arrays 二分查找(二分答案+二分下标)
- [SPOJ 287] Smart Network Administrator 二分答案+网络流
- POJ3579 Median(二分答案 + O(N)判定)
- USACO Jan08 (COGS 174) 架设电话线 二分答案,缩点,BFS判断可行性
- poj 2112 最大流+floyd+二分答案
- hdu 2199又是一道二分答案的题
- <队内胡策> 2017.10.10 (贪心+二分答案+DP)