题解 | #序列和#

序列和

http://www.nowcoder.com/practice/46eb436eb6564a62b9f972160e1699c9

刚拿到题目,想的是用目标和N去逐个除以L(L逐渐递增),因为是连续的正整数,因此可以通过整除的方式找到序列的中位数。如果是L是偶数,其中位数如果是几点五,那么往前后分别找L/2个数即可;如果L是奇数,那么中位数是整数,分别往前后找L/2-1个数;其余情况长度L需要自增。

题解:是通过递增数列的递推公式来处理的,通过公式求出首项。以下是Java和python的解法:

import java.util.Scanner;

public class Main{
    public static void solution(int N, int L){
        // 连续非负整数,长度尽可能短,所有数之和位N
        int i = L;
        while ( i <= 100){
            if ((2 * N - i*(i - 1)) % (2 * i)==0){
                int a1 = (2 * N - i*(i - 1)) / (2 * i);
                for (int j = 0; j < i-1; j++){
                    System.out.print(a1+" ");
                    a1++;
                }
                System.out.println(a1);
                break;
            }
            i++; // 不能整除,长度加1
        }
        if(i>100)
            System.out.println("No");
        return;
    }
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        int N = s.nextInt();
        int L = s.nextInt();
        solution(N,L);
    }
}
import math

N, L = map(int, input().split())
i = L
while i <= 100:
    a = (2 * N - i*(i - 1)) / (2 * i)
    if math.ceil(a) == a:
        for j in range(i- 1):
            print(int(a), end=" ")
            a += 1
        print(int(a))
        break
    i += 1
if i == 101:
    print("No")
全部评论

相关推荐

不愿透露姓名的神秘牛友
昨天 15:41
已编辑
淘天 算法工程师 31.0k*16.0
点赞 评论 收藏
分享
10-05 23:02
东北大学 Java
我说句实话啊:那时候看三个月培训班视频,随便做个项目背点八股,都能说3 40w是侮辱价
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务