Codeforces 551C - GukiZ hates Boxes (二分 + 贪心)
2015-06-13 11:55
344 查看
题意
有n堆东西,m个人,每个人在每一秒只能选择走到下一堆或者拿掉一个东西,问拿掉全部东西最少要多久。思路
二分时间。Check的时候,我们可以先拿出一个人,走到最近的非零堆,然后尽可能地搬东西,重复m次,看能不能搬完。
代码里的Check写得有点丑( TДT)
代码
#include <stack> #include <cstdio> #include <list> #include <cassert> #include <set> #include <fstream> #include <iostream> #include <string> #include <sstream> #include <vector> #include <queue> #include <functional> #include <cstring> #include <algorithm> #include <cctype> //#pragma comment(linker, "/STACK:102400000,102400000") #include <string> #include <map> #include <cmath> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/hash_policy.hpp> using namespace std; //using namespace __gnu_pbds; #define LL long long #define ULL unsigned long long #define SZ(x) (int)x.size() #define Lowbit(x) ((x) & (-x)) #define MP(a, b) make_pair(a, b) #define MS(arr, num) memset(arr, num, sizeof(arr)) #define PB push_back #define X first #define Y second #define ROP freopen("input.txt", "r", stdin); #define MID(a, b) (a + ((b - a) >> 1)) #define LC rt << 1, l, mid #define RC rt << 1|1, mid + 1, r #define LRT rt << 1 #define RRT rt << 1|1 #define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++) #define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++) const double PI = acos(-1.0); const int INF = 0x3f3f3f3f; const double eps = 1e-4; const int MAXN = 1e5+10; const int MOD = 8e4+7; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; const int seed = 131; int cases = 0; typedef pair<int, int> pii; int tmp[MAXN], arr[MAXN], n, pos, m; void Solve(LL mid) { bool first = true; LL rem = mid; while (true) { if (pos == n) return; while (!tmp[pos]) { pos++; if (!first) rem--; if (pos == n) return; } if (first) rem -= (pos+1); first = false; if (rem <= 0) return; if (tmp[pos] > rem) { tmp[pos] -= rem; break; } else { rem -= tmp[pos]; pos++; rem--; } } } bool Check(LL mid) { pos = 0; copy(arr, arr+n, tmp); for (int i = 0; i < m; i++) Solve(mid); return pos == n; } int main() { //ROP; scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%d", &arr[i]); LL l = 0, r = (1ll<<60); while (l < r) { LL mid = MID(l, r); if (Check(mid)) r = mid; else l = mid+1; } printf("%I64d\n", r); return 0; }
相关文章推荐
- hdu 4738 Caocao's Bridges 2013 ACM-ICPC杭州赛区网络赛 1001 双连通分量
- hdu 4750 2013 ACM/ICPC Asia Regional Nanjing Online 1003 并查集+离线操作
- hust 1626 Cutting rope
- 我的ACM-ICPC资源整理
- 2014 ACM-ICPC 亚洲地区赛 西安站小结
- hdu5007 ACM-ICPC 西安赛区网赛A题 水题
- Light 1003 - Drunk (拓扑排序)
- TopCoder SRM 659 Div2 Problem 500 - PublicTransit (思维)
- UVa 1529 - Clock (模拟)
- ZOJ 3736 Pocket Cube
- 一位ACMer过来人的心得
- poj1067
- 一位Acmer过来人的经验
- 2014 ACM-ICPC World Final Info board
- ZOJ 3826 Hierarchical Notation(Mudanjiang 2014)(JSON解析模拟)
- HDU 5073 Galaxy(Anshan 2014)(数学推导,贪心)
- HDU 5093 Battle ships(二部图最大匹配)
- HDU 5094 Maze(BFS、状态压缩)
- HDU 5092 Seam Carving(DP, 路径)
- HDU 5099 Comparison of Android versions(模拟-水题)