bjfu1099 度度熊大战僵尸
这也是2011年百度之星的一道题。
这题我就是乱搞搞过的,打代码之前自己心里也没底,不知道能不能过的。
我的做法很简单,就是按时间顺序依次构造能杀死的僵尸血量,找到第k小的。构造的方法也很暴力:对t时刻,第i个武器新构造出来的血量,就是用ai+t*bi依次去加之前时刻构造出来的血量。所以解题的关键就在于不断地对这个方法进行剪枝与优化。
第一个优化是,t只用从1到k,而不用再往后,很好理解。
第二,考虑如何存储已经产生的血量。我是用了一个set保存所有的血量,然后每一次循环时把set中的内容导出到一个数组里。往set里插入数据和查找数据都是log n的,所以把数据导出到数组里复杂度为n*log(n)。这里又可以加入一个优化,每次导出到数组里的元素只用前K个。
第三个优化,如果当t时刻,所有的ai+bi*t都比当前的结果大,则可以结束。
这样打完之后,自己测了几组数据,很快出结果,但是交上去依然超时。于是自己构造了几组变态数据,一测,发现瓶颈依然在set那里,因为对于大型的测试数据,后来的时刻产生的大量血量值都是以前出现过的,如果用hash来判断血量值是否出现过,就能把这里的复杂度从log(n)降到O(1),因为这里是瓶颈,所以效果很明显。果然,加上以后就过了。
代码如下:
/*
* bjfu1099
* Author : ben
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <functional>
#include <numeric>
#include <cctype>
using namespace std;
#ifdef ON_LOCAL_DEBUG
#else
#endif
typedef long long LL;
const int maxn = ;
int N, K;
int a[maxn], b[maxn];
int buf[];
set<int> S; const int maxh = ;
bool hash[maxh];
int hval[maxh]; void hash_insert(int num) {
int k = num % maxh;
while (hash[k] && hval[k] != num) {
k = (k + ) % maxh;
}
if (!hash[k]) {
hash[k] = true;
hval[k] = num;
}
} bool hash_find(int num) {
int k = num % maxh;
while (hash[k] && hval[k] != num) {
k = (k + ) % maxh;
}
return hash[k];
} int work() {
bool hasnew = true;
S.insert();
hash_insert();
int offset, I;
for (int t = ; t <= K; t++) {
if (hasnew) {
I = ;
set<int>::iterator it = S.begin();
while (it != S.end() && I <= K) {
buf[I++] = *(it++);
}
hasnew = false;
}
offset = (I > K) ? buf[K] : 0x7fffffff;
// printf("t = %d, offset = %d, I = %d\n", t, offset, I);
bool flag = false;
for (int i = ; i < N; i++) {
a[i] += b[i];
if (a[i] > offset) {
continue;
}
for (int j = ; j < I; j++) {
int p = a[i] + buf[j];
if (p < offset) {
flag = true;
if (!hash_find(p)) {//对于大型的测试数据,后面的插入太多重复,用hash能降掉这里的logn的复杂度
// if (S.count(p) <= 0) {
hasnew = true;
S.insert(p);
hash_insert(p);
}
} else {
break;;
}
}
}
if (!flag) {
break;
}
}
return buf[K];
} int main() {
#ifdef ON_LOCAL_DEBUG
freopen("data.in", "r", stdin);
#endif
memset(hash, false, sizeof(hash));
scanf("%d%d", &N, &K);
for (int i = ; i < N; i++) {
scanf("%d%d", &a[i], &b[i]);
}
printf("%d\n", work());
return ;
}
bjfu1099 度度熊大战僵尸的更多相关文章
- 少儿编程|Scratch编程教程系列合集,总有一款适合你
如果觉得资源不错,友情转发,贵在分享!!! 少儿编程Scratch: 少儿编程Scratch第一讲:Scratch完美的初体验少儿编程Scratch第二讲:奇妙的接球小游戏少儿编程Scratch第三讲 ...
- 深度 | AI芯片终极之战
深度 | AI芯片终极之战 https://mp.weixin.qq.com/s?__biz=MzA4MTQ4NjQzMw==&mid=2652712307&idx=1&sn= ...
- 基于C/S架构的3D对战网络游戏C++框架_【不定期更新通知】
由于笔者最近有比赛项目要赶,这个基于C/S架构的3D对战网络游戏C++框架也遇到了一点瓶颈需要点时间沉淀,所以近一段时间不能保证每天更新了,会保持不定期更新.同时近期笔者也会多分享一些已经做过学过的C ...
- 基于C/S架构的3D对战网络游戏C++框架_01服务器端与客户端需求分析
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 基于C/S架构的3D对战网络游戏C++框架_06搭建C/S架构的基本通信框架(尚未写完会重新编辑后再发出)
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 基于C/S架构的3D对战网络游戏C++框架_05搭建系统开发环境与Boost智能指针、内存池初步了解
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 基于C/S架构的3D对战网络游戏C++框架_04客户端详细设计与OpenGL、Qt基础
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 基于C/S架构的3D对战网络游戏C++框架_03服务器端详细设计
本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...
- 不死僵尸木马lpt7.asp.asp与lpt5.cnzzz.asp的删除方法
1. Dos命令 我们知道Windows下是不能以“aux|prn|con|nul|com1|com2|com3|com4|com5|com6|com7|com8|com9|lpt1|lpt2|lpt ...
随机推荐
- HTTP 408请求超时错误解决办法
错误描述 对于大多数网站而言,我们所看到的错误消息已经是开发者定制过的页面,比如我们最常见的自定义404错误页面,一般而言,我们看到的408错误应该是类似这样的提示:“408:Request Time ...
- 表单插件——form
表单插件——form 通过表单form插件,调用ajaxForm()方法,实现ajax方式向服务器提交表单数据,并通过方法中的options对象获取服务器返回数据,调用格式如下: $(form). a ...
- 【PHPsocket编程专题(实战篇②)】兼容 Curl/Socket/Stream 的 HTTP 操作类[转]
<?php /************************************************************ * 描述:HTTP操作类 * 作者:heiyeluren ...
- 【mysql的编程专题⑤】自定义函数
用户自定义函数(user-defined function,UDF) 是一种对mysql的扩展途径,其用法与内置函数相同 创建自定义函数 语法 create function function_nam ...
- C语言中时间调用处理的相关函数介绍
asctime(将时间和日期以字符串格式表示) 相关函数:time,ctime,gmtime,localtime 表头文件:#include<time.h> 定义函数:char * asc ...
- Mahout学习之Mahout简介、安装、配置、入门程序测试
一.Mahout简介 查了Mahout的中文意思——驭象的人,再看看Mahout的logo,好吧,想和小黄象happy地玩耍,得顺便陪陪这位驭象人耍耍了... 附logo: (就是他,骑在象头上的那个 ...
- Lumina将是基于 Qt工具箱,旨在取代KDE成为PC-BSD默认的桌面环境
Lumina Desktop 1.1.0 发布了,该版本是重要更新,包括全新的以及完全重新编写的utilities,并对底层基础架构进行改进. Lumina将是基于 Qt工具箱,旨在取代KDE成为PC ...
- Centos7安装Xmind
1.首先,下载对应版本的deb包,32bit系统下载32bit软件包,64bit系统下载64bit软件包 2.解压deb包,得到data.tar.gz 和control.tar.gz 两个归档文件 3 ...
- (转)Struts 拦截器
一.拦截器是怎么实现: 实际上它是用Java中的动态代理来实现的 二.拦截器在Struts2中的应用 对于Struts2框架而言,正是大量的内置拦截器完成了大部分操作.像params拦截器将http请 ...
- 设置UITableView section间距
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { return 0 ...