UVALive 7500 Boxes and Balls 2015EC final 签到题 二分

分析题目后,得到要求的是最接近n的一个数,并且这个数字能写成1+2+3+....+x = ans这种形式。

要求的是最大的值。

这题就直接二分去做吧。二分出一个f(mid)<=n的最大值。

最后的end就是所求的f(end)

为什么呢?,我来分析下我这个二分是怎么实现的

   while (begin<=end)
    {
        LL mid = (begin + end) / 2;
        if (f(mid) == n)
        {
            printf ("Case #%d: %lld\n",++ff,n);
            return ;
        }
        if (f(mid) < n)
        {
            begin = mid+1; //去找一个可能比n大的
        }
        else end = mid-1; //如果比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&1)
    {
        return (x+1)/2*x;
    }
    else return x/2*(x+1);
}
int ff;
void work ()
{
    LL n;
    cin>>n;
    LL begin=1,end=2e9;
    while (begin<=end)
    {
        LL mid = (begin + end) / 2;
        if (f(mid) == n)
        {
            printf ("Case #%d: %lld\n",++ff,n);
            return ;
        }
        if (f(mid) < n)
        {
            begin = mid+1; //去找一个可能比n大的
        }
        else end = mid-1; //如果比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 0;
}

时间: 2024-10-03 23:15:28

UVALive 7500 Boxes and Balls 2015EC final 签到题 二分的相关文章

uvalive 7500 Boxes and Balls

https://vjudge.net/problem/UVALive-7500 题意: 找到规律之后发现给出一个数n,要求找到1 + 2i + ... + x <= n,找出1到x的和. 思路: 一看n就知道要二分,还以为是二分写炸了...结果是r的范围太小了,因为n最大是1e18,又有除以2,所以r应该是2e9才对,不是1e9. 代码: 1 #include <stdio.h> 2 3 int main() 4 { 5 int t; 6 7 scanf("%d",&

LA 7500 Boxes and Balls (数学)

题意:给定 n 个球,每次从每篮子里拿出来一个放在一个新篮子里,并移除相同的,按球的个数进行排序,问你用最多几个球能完成循环. 析:数学问题,很容易发现前n项和就是最多的球数,所以我们只要找最大的n项就好了. 代码如下: #include <cstdio> #include <string> #include <cstdlib> #include <cmath> #include <iostream> #include <cstring&g

【CF884D】Boxes And Balls 哈夫曼树

[CF884D]Boxes And Balls 题意:有n个箱子和若干个球,球的颜色也是1-n,有ai个球颜色为i,一开始所有的球都在1号箱子里,你每次可以进行如下操作: 选择1个箱子,将里面所有的球拿出来,分成k部分(你可以令k=2或3),将每一部分都放到一个空箱子中.花费的代价是这个箱子中球的总数. 现要求你在若干次操作后,所有颜色为i的球都在i号箱子里,求最小代价. n<=200000,ai<=10^9 题解:傻逼题都不会做了.将操作反过来,就变成了将k个箱子合并到一起,这就变成经典的哈

XC1263 签到题(哇 ,写得我怀疑人生啊!!!@!@)

1263: 签到题 时间限制: 1 Sec  内存限制: 128 MB提交: 174  解决: 17 标签提交统计讨论版 题目描述 大家刚过完寒假,肯定还没有进入状态,特意出了一道签到题给各位dalao压压惊. 如果一个数字其中每一位都互不相同,则这个数满足要求.(如:21.10满足要求,11 不满足要求). 给出一个范围[a,b],并求出在范围内符合要求数字的数量. 输入 第一行T表示组数,T<=1000. 每一组输入一行,包含两个数字a,b.1<=a,b<=100000. 输出 对于

洛谷P3601签到题(欧拉函数)

题目背景 这是一道签到题! 建议做题之前仔细阅读数据范围! 题目描述 我们定义一个函数:qiandao(x)为小于等于x的数中与x不互质的数的个数. 这题作为签到题,给出l和r,要求求. 输入输出格式 输入格式: 一行两个整数,l.r. 输出格式: 一行一个整数表示答案. 输入输出样例 输入样例#1: 233 2333 输出样例#1: 1056499 输入样例#2: 2333333333 2333666666 输出样例#2: 153096296 说明 对于30%的数据,. 对于60%的数据,.

hpu 1695 一道签到题

一道签到题 时间限制: 2 Sec  内存限制: 128 MB 提交: 69  解决: 33 [提交][状态][讨论版] 题目描述 我想说这是一道签到题,意思就是本次测试中最水的一道,不过我这样说你真的愿意相信我吗?哈哈,题目是这样的给你一下小数,然后请告诉我分别告诉我这个小数的循环节的循环次数.循环节以及循环节长度 输入 输入包括多组测试数据每组测试数据1行,包括一个小数,小数的长度不超过200,小数大于0小于100 输出 分别输出这个小数的循环节的长度.循环节以及循环次数,中间以一个空格间隔

UVALive 4487 Exclusive-OR 加权并查集神题

已知有 x[0-(n-1)],但是不知道具体的值,题目给定的信息 只有 I P V,说明 Xp=V,或者 I P Q V,说明 Xp ^ Xq=v,然后要求回答每个询问,询问的是 某任意的序列值 Xp1^Xp2,,,,X^pk 这个题目用加权并查集是这么处理的: 1. f[]照样是代表父节点,照样进行路径压缩,把每个 V[i]=V[i]^V[f[i]],即节点存储的值实际是它与它父亲的异或的值.为什么要这样呢,因为异或首先满足交换律,而且异或同一个数偶数次,即相当于本身,那么这个题目的其中一个要

acm集训训练赛A题【签到题】

一.题目 Description After winning gold and silver in IOI 2014, Akshat and Malvika want to have some fun. Now they are playing a game on a grid made of nhorizontal and m vertical sticks. An intersection point is any point on the grid which is formed by t

hdu4931 Happy Three Friends(BestCoder Round#4签到题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4931 Happy Three Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 150    Accepted Submission(s): 128 Problem Description Dong-hao , Grandpa