Bonetrousle HackerRank 数学 + 思维题

https://www.hackerrank.com/contests/world-codesprint-6/challenges/bonetrousle

给定一个数n,和k个数,1--k这k个,要求选择b个数,使得这b个数的和等于n。

首先考虑最小值,在1--k中选择前b个数,是最小的,记为mi。最大值,后b个数相加,记为mx

注意到一个东西:如果mi <= n <= mx。那么是绝对可行的。因为mi总能增加1(同时保证满足要求),所以在这个区间里面的,都是可行解。

所以首先从mi开始枚举,每次把第B个数变成最大值k(第b - 1个数改成k - 1....依次类推,因为不能重复用数字)

则总能枚举到mi >= n。然后输出方案即可。

bug点:后b个数太大了,会爆LL。所以,当后面的数相加到 >= n的时候,够了,证明n是 <= mx的了,有可行解。

然后对着模拟即可。复杂度O(b)

#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>
const int maxn = 1e5 + 20;
LL a[maxn];
void work () {
//    ios::sync_with_stdio(false);
    LL n, k, b;
//    scanf ("%lld%lld%lld", &n, &k, &b);
    cin >> n >> k >> b;
    //cout << n << " " << k << " " << b << endl;
    LL mi = 0, mx = 0;
    for (int i = 1; i <= b; ++i) {
        mi += i;
    }
    for (LL i = k; i >= k - b + 1; --i) {
        mx += i;
        //if (mx < 0) while (1);
        if (mx >= n) break; // ok
    }
    //cout << mi << " " << mx << endl;
    if (mx < n) {
        printf ("-1\n");
        return ;
    }
    if (mi > n) {
        printf ("-1\n");
        return ;
    }
    LL now = mi;
    int to = b;
    LL get = k;
    for (int i = 1; i <= b; ++i) a[i] = i;
    while (true) {
        now = now - a[to] + get;
        a[to] = get;
        if (now >= n) {
            LL cut = now - n;
            a[to] -= cut;
            for (int i = 1; i <= b - 1; ++i) {
                printf ("%lld ", a[i]);
            }
            printf ("%lld\n", a[b]);
            break;
        }
        to--;
        get--;
    }
}

int main ()
{
#ifdef LOCAL
    freopen("data.txt","r",stdin);
#endif
    int t;
    cin >> t;
//    cout << t << endl;
    while (t--) work ();
    return 0;
}

时间: 2024-10-09 21:22:14

Bonetrousle HackerRank 数学 + 思维题的相关文章

Acdreamoj1115(数学思维题)

题意:1,3是完美数,如果a,b是完美数,则2+a*b+2*a+2*b,判断给出的n是否是完美数. 解法:开始只看出来2+a*b+2*a+2*b=(a+2)*(b+2)-2,没推出更多结论,囧.没办法,只能暴力将所有的完美数求出来然后查表.正解是c+2=(a+2)*(b+2);完美数都是有质因子3或5组成的(5本身除外): 自己暴力代码: /****************************************************** * author:xiefubao *****

杭电2018多校第一场(2018 Multi-University Training Contest 1) 1001.Maximum Multiple (HDU6298)-数学思维题(脑子是个好东西,可惜我没有)

暑假杭电多校第一场,这一场是贪心场,很多贪心的题目,但是自己太菜,姿势挫死了,把自己都写吐了... 2018 Multi-University Training Contest 1 HDU6298.Maximum Multiple 题目意思就是给你一个n,找出来三个数x,y,z, 使得n=x+y+z,而且x,y,z都是n的因数,并且x*y*z为最大值,让你输出来x*y*z的最大值.如果没有满足条件的情况就输出-1. 由1=1/2+1/3+1/6=1/3+1/3+1/3=1/2+1/4+1/4,所

51Nod 1003 阶乘后面0的数量(数学,思维题)

1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 Input示例 5 Output示例 1题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1003编程之美有讲:一个数 n

HDU 4972 A simple dynamic programming problem(数学思维题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4972 Problem Description Dragon is watching NBA. He loves James and Miami Heat. Here's an introduction of basketball game:http://en.wikipedia.org/wiki/Basketball. However the game in Dragon's version is

【程序员的数学思维修炼】总结一

第一章 数据的表示 主要学习了会了 0 不是什么都没有,比如在java里BigDecimal里面是根据最高的那个精度来的,比如1.99+0.01=2.00 这时候提交可能会判错,所以要去掉后导零 为啥要用二进制 还有哪些进制,神奇的八卦,八进制.钟表使用的十二进制.半斤八两十六进制.60年一个甲子六十进制 关于二进制,最主要的是要熟练掌握位运算!一些做题中常用的技巧,比如求n的m次方,判断奇偶,统计一的个数, 这一章里还提到了20!阶乘问题,还记得怎么解决大数阶乘吗. 第二章 神奇的素数 1.验

2018高考数学真题权威专家评析+2019备考方向解读

2018高考数学真题汇总!权威专家评析+2019备考方向解读 "试卷稳中求新,在保持结构总体稳定基础上,科学灵活地确定试题内容,强调数学应用,突出关键能力."教育部考试中心命题专家认为,2018年高考数学卷一个突出的特点是,根据文理科考生数学素养综合要求,调整文理科同题比例,为新一轮高考数学不分文理科的改革进行了积极探索. 探索内容改革,助推素质教育 教育部考试中心命题专家介绍,根据文理科考生数学素养的综合要求,调整全国Ⅱ卷.全国Ⅲ卷文理科同题比例,为新一轮高考数学不分文理科改革进行了

Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 E. Excellent Engineers-单点更新、区间最值-线段树 G. Growling Gears I. Interesting Integers-类似斐波那契数列-递推思维题

先写这几道题,比赛的时候有事就只签了个到. E. Excellent Engineers 传送门: 这个题的意思就是如果一个人的r1,r2,r3中的某一个比已存在的人中的小,就把这个人添加到名单中. 因为是3个变量,所以按其中一个变量进行sort排序,然后,剩下的两个变量,一个当位置pos,一个当值val,通过线段树的单点更新和区间最值操作,就可以把名单确定. 代码: 1 //E-线段树 2 #include<iostream> 3 #include<cstdio> 4 #incl

智商的比拼——思维题思考指南

智商的比拼--思维题思考指南 最近做了几道思维题,感觉思维题就是烧脑,而且费劲,而且做不出QAQ!! 思维题可能分一下几个类别吧 鲨壁结论题.神犇之于结论题,如鱼之于水.而我之于结论题,QAQ. 数论大法好.有些题目直接数学建模找结论啊QAQ,就比如[Running]这道题,关键性的东西就是\((a_i,n)|\ l\),实际上这个就是数学建立同余方程然后得出来的一个浅显结论(我找这个"浅显"的结论花了\(30min\) \(QAQ\)). 代数大法好.实际上和前面那个重合了,不过拿出

数学趣味题(相邻同加同减问题)

想要弥补数学方面的知识于是我看了刘汝佳老师的算法艺术. 从简单开始在这里记录一下. 题目的描述 很容易理解但是让我想的话,我会感觉很困难. 似乎见到多了,对这种问题有一种天生的恐惧. 但是学习嘛,一点一点积累. 刘汝佳老师这样讲到. 先把8个点归为红色和蓝色两类. 相邻的点不在同一类中. 假设我们先看一下最下面的ABCD四个点,假设A点有a个麻烦子,B点有b个麻烦子,C点有c个,D点有d个. 我们先让A,B同时增加c个,然后让B,C同时减少c个,这样就C就没有了,而A中多了c个.这样我们就能把同