UVALive 7500 Boxes and Balls 2015EC final 签到题 二分
2024-10-17 16:03:51
分析题目后,得到要求的是最接近n的一个数,并且这个数字能写成1+2+3+....+x = ans这种形式。
要求的是最大的值。
这题就直接二分去做吧。二分出一个f(mid)<=n的最大值。
最后的end就是所求的f(end)
为什么呢?,我来分析下我这个二分是怎么实现的
while (begin<=end)
{
LL mid = (begin + end) / ;
if (f(mid) == n)
{
printf ("Case #%d: %lld\n",++ff,n);
return ;
}
if (f(mid) < n)
{
begin = mid+; //去找一个可能比n大的
}
else end = mid-; //如果比n大了的话。就回来找一个小的。
//cout<<f(mid)<<endl;
}
当f(mid)<n的时候 begin = mid+1,如果这个时候[mid+1,end]的所有数字的f()值都大于n呢?那么,最后一步就肯定是begin=end,然后end-1.去到的是第一个小于n的f()值。
其他也是一样分析啦。
f(end),第一个小于n的f值。
f(begin),第一个大于n的f值。考虑最后一步begin==end的时候,就能看清楚了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
LL f(LL x)
{
if (x&)
{
return (x+)/*x;
}
else return x/*(x+);
}
int ff;
void work ()
{
LL n;
cin>>n;
LL begin=,end=2e9;
while (begin<=end)
{
LL mid = (begin + end) / ;
if (f(mid) == n)
{
printf ("Case #%d: %lld\n",++ff,n);
return ;
}
if (f(mid) < n)
{
begin = mid+; //去找一个可能比n大的
}
else end = mid-; //如果比n大了的话。就回来找一个小的。
//cout<<f(mid)<<endl;
}
printf ("Case #%d: %lld\n",++ff,f(end));
return ;
} int main()
{
#ifdef local
freopen("data.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--) work();
return ;
}
最新文章
- 目前quanben评十大哲学家
- C# List中随机获取N个字符
- [转]qt中文乱码问题
- LoadRunner - 实战,转发
- bzoj 1187: [HNOI2007]神奇游乐园 插头dp
- C++中new和不new的区别
- cocos2dx-3.0(13)------SpriteBatchNode与SpriteFrameCache渲染速度
- Netty轻量级对象池实现分析
- 构建微服务(Building Microservices)-PDF 文档
- Bootstrap快速入门
- css怎样让背景充满整个屏幕
- css去除ios文本框默认圆角
- 2019-04-09 SpringBoot+Druid+MyBatis+Atomikos 的多数据源配置
- 明令禁止下,哪些APP在违规获取用户信息?
- 基于centOS7:新手篇→nginx安装
- Oracle分析函数row_number()等的使用实例
- spring cloud 入门系列一:初识spring cloud
- android speakerphone/
- HDU1241 Oil Deposits 2016-07-24 13:38 66人阅读 评论(0) 收藏
- Glide填坑指南