Lightoj1156【二分+贪心】
来源:互联网 发布:桌游手机软件 编辑:程序博客网 时间:2024/05/19 21:01
题意:略。
思路:
以为我这个思路是大众思路原来不是。。。百度了一下什么最大流(膜拜熟练应用最大流选手)
二分很显然对吧,然后我就想二分完DP嘛,好像不行,感觉怎么搞都是你已经把答案搞出来的感觉,所以二分显得没有意义,想想贪心吧~
然后突然一想,其实你想啊,走回来和走过去是一样的对吧,无非就是有些不能一起走。那么我们先在起始位置(0)放两个人,然后一起往前走,首先找一个能走的最远的无约束位置,如果找不到,就让他们两个分开了,这时候只要走小一点,慢慢走,默认第一个人走的比第二个人走的少; 但是会存在当前两个人位置不一样的情况,那就按小的位置来找能在一起的位置,不能的话,给小的位置找一个位置,然后就这样过了,233333333,具体思路自己体会吧~
#include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<queue>#include<vector>#include<map>#include<set>#include<algorithm>#include<list>using namespace std;typedef pair<int,int> PII;typedef long long LL;#define mem(a, b) memset(a, b, sizeof(a))#define lson l, m, rt<<1#define rson m+1, r, rt<<1|1const double eps = 1e-9;const double pi = acos(-1.0);const int INF = 0x3f3f3f3f;const int Maxn = 1e2 + 10;int n, d;bool f[Maxn], vis[Maxn];int dis[Maxn];bool Judge(int Max){ memset(vis, false, sizeof(vis)); int p1, p2, pos; p1 = p2 = 0; while(p1 <= n && p2 <= n){ if(p1 == p2){ pos = -1; for(int i=p1+1;i<=n+1;i++){ if((dis[i] - dis[p1] <= Max) && (!f[i])) pos = i; else break; } if(pos == -1){ pos = -1; for(int i=p1+1;i<=n+1;i++){ if(dis[i] - dis[p1] <= Max && !vis[i]){ pos = i; break; } } if(pos == -1) return false; vis[pos] = true; p1 = pos; pos = -1; for(int i=p1+1;i<=n+1;i++){ if(dis[i] - dis[p2] <= Max && !vis[i]){ pos = i; break; } } if(pos == -1) return false; vis[pos] = true; p2 = pos; } else { if(pos == n+1) return true; p1 = p2 = pos; } } else { if(p1 > p2) swap(p1, p2); pos = -1; for(int i=p1+1;i<=n+1;i++){ if((dis[i] - dis[p1] <= Max) && (!f[i])) pos = i; } if(pos == -1){ for(int i=p1+1;i<=n+1;i++){ if((dis[i] - dis[p1] <= Max) && (!vis[i])) { pos = i; break; } } if(pos == -1) return false; vis[pos] = true; p1 = pos; } else{ if(pos == n+1) return true; p1 = p2 = pos; } } }}void Debug(){ for(int i=0;i<=n+1;i++) printf("%d\n", f[i]);}void solve(){ int Mid; int Left = 1, Right = d; while(Left < Right){ Mid = Left + (Right - Left) / 2; if(Judge(Mid)) Right = Mid; else Left = Mid + 1; } printf("%d\n", Left);}int main(){ int T, cas = 1; char ch; scanf("%d", &T); while(T--){ scanf("%d%d", &n, &d); getchar(); f[0] = false; f[n+1] = false; dis[0] = 0; dis[n+1] = d; for(int i=1;i<=n;i++){ scanf("%c-%d", &ch, &dis[i]); getchar(); if(ch == 'S') f[i] = true; else f[i] = false; }// Debug(); printf("Case %d: ", cas++); solve(); } return 0;}
阅读全文
0 0
- Lightoj1156【二分+贪心】
- 二分+贪心
- 贪心 + 二分
- 贪心二分
- 贪心+二分
- 贪心(bnuoj49103+二分+贪心)
- BNU 49103 贪心【二分+贪心】
- hdu pie(二分+贪心)
- POJ3497 Assemble 二分+贪心
- mysterious 二分加贪心
- HDU 3650 贪心+二分
- 11627 - Slalom (二分+贪心)
- 二分+贪心+LA3177
- hdu4004(二分+贪心)
- hdu1677(贪心+二分)
- poj2456(贪心+二分)
- poj1064(贪心+浮点二分)
- 二分+贪心(总结)
- 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
- 游戏中的设计模式八(享元模式)
- ruby 安装
- 线程Thread与Runnable接口
- 用户在线状态维护
- Lightoj1156【二分+贪心】
- 配置keepalived ping不通 解决办法
- Eslint 配置及规则说明
- 对卡尔曼滤波的理解
- SQL
- Tensorflow学习(6)模型的保存与恢复(saver)
- SEO小结
- 高亮
- 测试点总结。。。