题解 | #序列和#

序列和

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")
全部评论

相关推荐

07-11 13:16
湖南工学院 Java
点赞 评论 收藏
分享
05-26 22:25
门头沟学院 Java
Java小肖:不会是想叫你过去把你打一顿吧,哈哈哈
点赞 评论 收藏
分享
点赞 评论 收藏
分享
07-09 18:28
门头沟学院 Java
写着提前批,结果还要实习4个月以上???
程序员牛肉:这种不用看,直接投了,面试的时候问对应的HR就行。有可能他们是直接复制的暑期实习的模板。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务