Codeforces Round #278 (Div. 2) C. Fight the Monster 二分+枚举
2015-07-21 13:25
363 查看
二分所需的花费,对给定花费枚举hp、atk、def的购买数量。
代码如下
代码如下
#include <cstdio> using namespace std; #define INF 30100 #define max(a, b) (a) > (b) ? (a) : (b) int hp[2], atk[2], def[2]; int h, a, d; bool check(int x){ int bound_hp = x / h, rest = x; bool found = false; for(int i = 0; i <= bound_hp && !found; ++i){ int bound_atk = rest / a, rest_d = rest, new_hp = hp[0] + i; for(int j = 0; j <= bound_atk && !found; ++j){ int new_atk = atk[0] + j; int new_def = def[0] + rest_d / d; rest_d -= a; int dec_y = max(0, atk[1] - new_def), dec_m = max(0, new_atk - def[1]); if(dec_m == 0) continue; else if(dec_y == 0) found = true; else{ int time = hp[1] % dec_m ? hp[1] / dec_m + 1 : hp[1] / dec_m; if(dec_y * time < new_hp) found = true; } } rest -= h; } return found; } int main(){ scanf("%d %d %d", &hp[0], &atk[0], &def[0]); scanf("%d %d %d", &hp[1], &atk[1], &def[1]); scanf("%d %d %d", &h, &a, &d); int l = 0, r = INF; while(l < r){ int mid = l + ((r - l) >> 1); if(check(mid)) r = mid; else l = mid + 1; } printf("%d\n", l); return 0; }
相关文章推荐
- nil,Nil,NULL,NSNull
- 第五天实习体会与记录
- *LeetCode:Longest Palindromic Substring
- 路由器怎么设置无线上网
- liunx连接不上外网
- 随笔2
- 使用CFStringTransform将汉字转换为拼音
- 201507之佛山移动实习
- 第十节
- C语言中的转义字符
- http请求方法详解
- js实现图片轮播
- css3时钟
- 你决不可错过的JavaScript全栈教程
- 小波说雨燕 第三季 构建 swift UI 之 UI组件集-视图集(三)Activity Indicators视图 学习笔记
- C语言头文件介绍
- Mybatis的ResultMap的使用
- pig配置
- hdoj 2277 Change the ball 【找规律】
- Geometry Made Simple