题意:你要从[1,n]这个n个数中猜出来规定的某个数,现在这个数未知,问你在最糟糕的情况下(但是你采用了最优的策略),你要猜多少次才能猜出这个数。现在有两种条件:

第一种:当你猜的数比指定的那个数小的时候,系统会提示你small;

第二种:当你猜的数比指定的那个数大的时候,系统会提示你wrong,但是从这以后不论你猜的数比指定数大或小,系统将永远提示你wrong。

在这里最糟糕情况可以理解为这个人很倒霉,命运总是让他多猜。

分析:

数列:1,2,3,4,....,k,....,n

比如说你猜了数字k,那么现在有两种情况:

α.你猜的数字比指定的数字大了,由于你很倒霉,所以你得一个个地往小里猜,此时最糟糕的情况是指定数字是1,那么你要猜k - 1次;

β.你猜的数字比指定的数字小了,那么相当于又开始了一个规模为n-k的游戏;

现在定义dp[i]---->在最糟糕的情况下,从规模为i的数列中猜数,最少要猜多少次。

那么我们应该怎么制定自己的策略呢?由于你很倒霉,那么命运一定会让你进入两种情况中多的那一种。那么好,我就让两种情况要猜的数尽量相等,这样就是最优的策略。

dp[i] = min{max(k-1,dp[i-k])+1;

memset(dp,F,sizeof(dp));
dp[] = ,dp[] = ,dp[] = ,dp[] = ;
for(int i = ;i <= ;++i){
for(int j = ;j <= i;++j){
dp[i] = min(dp[i],max(dp[i - j],j - ) + );
}
}

然而n<= 109,这样的时间复杂度是O(n2),空间复杂度是O(n)。

即爆时间又爆空间。

这就是为啥说这是个假dp了,然而让人惊喜的是,这道题目的得数有规律:

从1到n对应的得数分别是:1个1,2个2,3个3,4个4......

那这个就相当于解一个不等式了,(X2+X)/2 ≥ n,由于在定义域上单调,这里用二分搜索即可:

AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
//#define LOCAL
using namespace std;
int calculate(int x)
{
return (x * x + x)>>;
}
int main()
{
//#ifdef LOCAL
//freopen("TOJ4101.txt","r",stdin);
//freopen("TOJ4101out.txt","w",stdout);
//#endif
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
int rht = ,lft = ,mid = (lft + rht)>>,temp;
while(rht != lft){
temp = calculate(mid);
if(temp < n) lft = mid + ;
else if(temp == n){
lft = mid;
break;
}
else if(temp > n){
rht = mid;
}
mid = (lft + rht)>>;
//printf("left is %d and right is %d\n",lft,rht);
}
printf("%d\n",lft);
}
return ;
}

最新文章

  1. c++ 宏定义声明类,并在类中实现回调
  2. IIS7 配合 vs2013内置 LocalDB使用
  3. 【android Studio】零git知识、零脚本命令,即刻体验git版本管理魅力!
  4. iOS学习之应用数据存储1-属性列表、偏好设置、NSKeyedArchiver归档
  5. Spring基础——在Spring Config 文件中配置 Bean
  6. cvLoadImage函数解析 cvLoadImageM()函数
  7. 新浪微博sdk bug
  8. 从客户端中检测到有潜在危险的Request.Form值 的解决方法
  9. 【风马一族_C】c语言版,在2到n中寻找出所有的素数
  10. shell字符串操作详解
  11. Chrome控制台输入多行js
  12. hdu 1755 A Number Puzzle
  13. Scrapy在win7 32位的安装及依赖包
  14. trove,测试,db小解析
  15. 配置Eclipse支持java和xml文件的代码补全功能
  16. CVE-2017-12149 JBOOS AS 6.X 反序列化漏洞利用
  17. 毕业设计(2):基于MicroPython的家庭可燃气体泄露微信报警器
  18. IntelliJ IDEA 集成 SVN
  19. entity framework codefirst 用户代码未处理DataException,InnerException基础提供程序在open上失败,数据库生成失败
  20. Linux如何查看YUM的安装目录

热门文章

  1. dd命令的使用简介
  2. 腾讯云上Selenium用法示例
  3. Java线程池(ThreadPool)详解
  4. 一款好用的分页插件用于regularJS
  5. JS绑定种类汇总
  6. SELECT中的多表连接
  7. 让你的JS代码更具可读性
  8. 浅谈 angular新旧版本问题
  9. jquery虎牙TV3D轮播特效
  10. EzHttp 流传输调用代码示例