首页 > 试题广场 >

客似云来

[编程题]客似云来
  • 热度指数:10249 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好:他们只要来这家店吃过一次早餐,就会每天都过来;并且,所有人在这家店吃了两天早餐后,接下来每天都会带一位新朋友一起来品尝。
于是,这家店的客人从最初一个人发展成浩浩荡荡成百上千人:1、1、2、3、5……
现在,NowCoder想请你帮忙统计一下,某一段时间范围那他总共卖出多少份早餐(假设每位客人只吃一份早餐)。

输入描述:
测试数据包括多组。
每组数据包含两个整数from和to(1≤from≤to≤80),分别代表开店的第from天和第to天。


输出描述:
对应每一组输入,输出从from到to这些天里(包含from和to两天),需要做多少份早餐。

#include<iostream>
using namespace std;

int main()
{
int low = 0, high = 0;
long long array[81] = { 0ll };
long long sum = 0;

array[1] = 1ll;
array[2] = 1ll;


for (int i = 3; i < 81; i++)
{
array[i] = array[i - 2] + array[i - 1];
}

while (scanf("%d%d",&low,&high)!=EOF)
{
sum = 0;
for (int i = low; i <= high;i++)
{
sum += array[i];
}
cout << sum << endl;
}
return 0;
}

发表于 2015-10-11 18:36:15 回复(0)
更多回答
求斐波那契数列的范围和
// write your code here cpp
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int from,to;
    while(cin>>from>>to)
    {
        long sum = 0,a = 1,b = 1;
        for(int i = 0;i < to; ++i)
        {
            if(i>=from-1)
                sum+=a;
            swap(a,b);
            b += a;
        }
        cout<<sum<<endl;
    }
    return 0;
}

编辑于 2020-03-05 16:27:33 回复(1)
这道题有几个坑,第一个是要用大数表示,32位的数表示不了,第二个是from和to可以是一样的
如果两者一样,输出就是相应斐波那契数列的值
class Fibonacci {
	Fibonacci(int from, int to) {
		len = to;
		num = new long[len];
		num[0] = 1;
		if (len > 1)
			num[1] = 1;
		sum = 0;
		setFib(from);
	}
	private void setFib(int from) {
		for(int i = 2; i < len; i++) {
			num[i] = num[i - 1] + num[i - 2];
		}
		sum = num[from - 1];
		for(int i = from; i < len; i++)
			sum += num[i];
	}
	public long getFib(){
		return sum;
	}
	private int len;
	private long[] num;
	private long sum;
}


public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		while (cin.hasNext()) {
			Fibonacci fib = new Fibonacci(cin.nextInt(), cin.nextInt());
			System.out.println(fib.getFib());
		}
		cin.close();
	}
}

发表于 2017-04-06 21:47:01 回复(0)
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 客似云来
 * 题目描述
 * NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好:他们只要来这家店吃过一次早餐,
 * 就会每天都过来;并且,所有人在这家店吃了两天早餐后,接下来每天都会带一位新朋友一起来品尝。
 * 于是,这家店的客人从最初一个人发展成浩浩荡荡成百上千人:1、1、2、3、5……
 * 现在,NowCoder想请你帮忙统计一下,某一段时间范围那他总共卖出多少份早餐(假设每位客人只吃一份早餐)。
 * 输入描述:
 * 测试数据包括多组。每组数据包含两个整数from和to(1≤from≤to≤80),分别代表开店的第from天和第to天。
 * 输出描述:
 * 对应每一组输入,输出从from到to这些天里(包含from和to两天),需要做多少份早餐。
 * 输入例子:
 * 1 10
 * 2 8
 * 36 80
 * 输出例子:
 * 143
 * 53
 * 61305790697453774
 *
 * @author shijiacheng
 * @date 2018/2/12.
 */
public class BP1004GuestArrive {
    private static Map<Integer, Long> map = new HashMap<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int from = sc.nextInt();
            int to = sc.nextInt();
            long count = 0;
            for (int i = from; i <= to; i++) {
                count = count + getPersonCount(i);
            }
            System.out.println(count);
        }

    }

    public static long getPersonCount(int day) {
        if (day == 1) {
            return 1;
        }
        if (day == 2) {
            return 1;
        }
        //1、1、2、3、5……
        long prePreNum = 1;
        long preNum = 1;
        long result = 0;
        if (map.containsKey(day)) {
            return map.get(day);
        } else {
            for (int i = 3; i <= day; i++) {
                result = prePreNum + preNum;
                map.put(i, result);
                prePreNum = preNum;
                preNum = result;
            }
            return result;
        }

    }
}
发表于 2018-02-12 20:58:15 回复(0)
import java.util.*;
public class Main{
    private static long[] fibs = new long[81];
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int from = scanner.nextInt();
            int to = scanner.nextInt();
            long ans = 0;
            Fibonacci();
            for (int i = from; i <= to; i++) {
                ans += fibs[i];
            }
            System.out.println(ans);
        }
    }
     private static void Fibonacci() {
        fibs[0] = 0;
        fibs[1] = 1;
        fibs[2] = 1;
        for (int i = 3; i < fibs.length; i++) {
            fibs[i] = fibs[i - 1] + fibs[i - 2];
        }
    }
}

发表于 2022-03-30 22:06:26 回复(0)
//Fibonacci数列 from 位置到 to 位置 元素和,注意不要溢出。
#include<iostream>
using namespace std;
int main(){
    long long arr[80]={1,1};
    for(int i=2;i<80;i++){
        arr[i] = arr[i-1]+arr[i-2];
    }
    int from = 0, to = 0;
    
    while(cin>>from>>to){
        long long res = 0;
        for(int i = from;i<=to;i++){
            res = res + arr[i-1];
        }
        cout<<res<<endl;
    }
    return 0;
}

编辑于 2019-06-25 21:32:38 回复(0)
import java.util.*;
import java.math.*;

public class Main{
    public static void main(String[] args){
        BigInteger[] people=new BigInteger[85];
        people[0]=new BigInteger("1");
        people[1]=new BigInteger("1");
        for(int i=2;i<85;i++){
            people[i]=people[i-1].add(people[i-2]);
        }
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int from=sc.nextInt();
            int to=sc.nextInt();
            BigInteger result=new BigInteger("0");
            for(int i=from-1;i<to;i++){
                result=result.add(people[i]);
            }
            System.out.println(result);
        }
    }
}

发表于 2018-09-29 18:27:04 回复(0)
//经典的斐波那契数列应用,加上前缀和的运用可以解决问题。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    long long data[81];
    long long sum[81];
    data[1] = data[2] = 1;
    sum[1] = 1;sum[2] = 2;
    for(int i = 3;i <=80; ++i){
        data[i] = data[i-1]+data[i-2];
        sum[i] = sum[i-1]+data[i];
    }
    int f,t;
    while(scanf("%d %d",&f,&t)!=EOF){
        cout<<sum[t] - sum[f]+data[f]<<endl;
    }
    return 0;
}
发表于 2018-03-27 15:06:29 回复(0)
#include <iostream>
using namespace std;
 
int main()
{
    int i,x;
    int n,a,b,c,s,m[55];
    m[0]=1;
    for(i=1; i<55; i++){
        n=i;
        a=1,b=2,c=3,s=4;
        if(n==1)s=1;
        else if(n==2)s=2;
        else if(n==3)s=3;
        while (n>4){
            a=b,b=c,c=s;
            s=a+c;
            n--;
        }
        m[i]=s;
    }
    while (cin>>x){
        cout<<m[x]<<endl;
    }
    return 0;
}

发表于 2015-05-17 01:00:08 回复(0)

python solution:

while True:
    try:
        line,res = input(), [1,1]
        b,a=map(int,line.split())
        while len(res) < a:
            res.append(res[-1] + res[-2])
        print(sum(res[b-1:a]))
    except:
        break
发表于 2017-10-10 21:06:14 回复(0)
#include <iostream>
#include <vector>
using namespace std;
int main(){
    int from, to;
    long long count;
    while(cin >> from >> to){
        count = 0;
        vector<long long> v(80, 0);
        v[0] = 1;
        v[1] = 1;
        for(int i = 2; i < 80; ++i){
            v[i] = v[i - 2] + v[i - 1];
        }
        for(int i = from - 1; i < to; ++i){
            count += v[i];
        }
        cout << count << endl;
    }
    return 0;
}

发表于 2020-08-20 15:15:13 回复(1)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);


        long[][] breakfastDp = new
        long[81][3]; // beakfastDp[i][0] 代表第 i 天 第一次来吃早餐
        // beakfastDp[i][1] 代表第 i 天 第二次来吃早餐
        // beakfastDp[i][2] 代表第 i 天 一直来吃早餐还带朋友
        breakfastDp[1][0] = 1;
        for (int i = 2; i <= 80; i++) {
            breakfastDp[i][0] = breakfastDp[i - 1][1] + breakfastDp[i - 1][2];
            breakfastDp[i][1] = breakfastDp[i - 1][0];
            breakfastDp[i][2] = breakfastDp[i - 1][1] + breakfastDp[i - 1][2];
        }

        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            int b = in.nextInt();
            long count = 0;
            for (int i = a; i <= b; i++) {
                count += breakfastDp[i][0];
                count += breakfastDp[i][1];
                count += breakfastDp[i][2];
            }
            System.out.println(count);
        }
    }
}
发表于 2023-08-15 21:07:13 回复(0)

斐波那契,动态规划思想,需要用vector保存前面的值,用于统计


#include<iostream> #include<vector> using namespace std; int main() {     int from=0;     int to=0;          while(cin>>from>>to)     {        //循环里是dp[i+1],所以多开一个       vector<long long> dp(to+1,0);         //dp[0]不管了,直接从dp[1]代表第一天         dp[1]=1;         dp[2]=1;       for(int i=2;i<to;i++)       {           dp[i+1]=dp[i]+dp[i-1];       }         long long count=0;         //from,to也要算,count统计       for(int i=from;i<=to;i++)       {          count+=dp[i];       }          cout<<count<<endl;     }         return 0; }

发表于 2021-06-02 21:55:39 回复(0)
import java.util.Scanner;

/*
 * 客似云来
 */
public class Main {
    public static void main(String[] args) {
        long []fib = new long[81];
        fib[1] = 1;
        fib[2] = 1;
        for (int i = 3; i < 81; i++) {
            fib[i] = fib[i - 1] + fib[i - 2];
        }
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int from = sc.nextInt();
            int  to = sc.nextInt();
            long ans = 0;
            for (int i = from; i <= to; i++) {
                ans += fib[i];
            }
            System.out.println(ans);
        }
    }
}

发表于 2023-04-12 20:28:45 回复(0)
#include<iostream>
#include<vector>
using namespace std;

int main()
{
    vector<long long> B(81,0);
    B[1] = 1;
    B[2] = 1;
    for(int i = 3; i <= 80; i++){
        long long next = B[i-1] + B[i-2];
        B[i] = next;
    }
    int n,m;
    while(cin >> n >> m)
    {
        long long sumB = 0;
        for(int i = n; i <= m; i++)
        {
            sumB += B[i];
        }
        cout << sumB << endl;
    }
    return 0;
}

发表于 2023-02-15 14:10:09 回复(0)
// write your code here
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        while (sc.hasNext()) {
            int from = sc.nextInt();
            int to = sc.nextInt();
            long ans = 0L;
            long[] data = new long[to + 1];
            data[0] = 1;
            data[1] = 1;
            for (int i = 2; i < to; i++) {
                data[i] = data[i - 1] + data[i - 2];
            }
            for (int i = from - 1; i < to; i++) {
                ans += data[i];
            }
            System.out.println(ans);
        }
    }
}

发表于 2022-10-01 14:59:28 回复(0)
注意要用long类型存储
import java.util.Scanner;

/**
 * @author haomin
 * @date 2022/06/01 18:13
 **/
public class Main {
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int start = in.nextInt();
            int end = in.nextInt();

            long[] dp = new long[end + 2];
            long result = 0;
            dp[1] = 1;
            dp[2] = 1;
            for(int i = 3;i < end+1;i++){
                dp[i] = dp[i-1] + dp[i-2];
            }

            for (int i = start; i <= end ; i++) {
                result += dp[i];
            }
            System.out.println(result);
        }
        in.close();
    }
}


发表于 2022-06-01 18:25:11 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        long[] arr = new long[81];
        arr[0] = 0;
        arr[1] = 1;
        arr[2] = 1;
        for(int i = 3;i < arr.length;i++){
            arr[i] = arr[i  -1] +arr[ i - 2];
        }
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int from = sc.nextInt();
            int to = sc.nextInt();
            long sum = 0;
            for(int i = from;i <= to;i++){
                sum += arr[i];
            }
            System.out.println(sum);
        }
    }
}


编辑于 2022-05-15 22:33:28 回复(0)
// write your code here
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
        int a=sc.nextInt();
        int b=sc.nextInt();
        long[] arr=new long[b];
        arr[0]=1;
        arr[1]=1;
        for(int i=2;i<b;i++){
            arr[i]=arr[i-1]+arr[i-2];
        }
        long sum=0;
        for(int j=a-1;j<b;j++){
            sum+=arr[j];
        }
        System.out.println(sum);
        }
    }
}
求问各位大佬这是为啥啊,说返回非零

发表于 2022-03-30 17:00:03 回复(0)
由于题目已经限制了输入数据的范围,所以可以先把所有的数据算出来,最后相加即可。
import java.util.Scanner;

public class Main{
    private static long[] insert(){
        //1 <= sc <= 80
        long[]dp = new long[81];
        dp[1]=1;
        dp[2]=1;
        for(int i=3;i<81;++i){
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp;
    }

    public static void main(String[]args){
        Scanner sc = new Scanner(System.in);
        long[]dp = insert();
        while(sc.hasNext()){
            int from = sc.nextInt();
            int to = sc.nextInt();
            long sum=0;
            for(int i=from;i<=to;++i){
                sum+=dp[i];
            }
            System.out.println(sum);
        }

    }
}


发表于 2022-03-29 20:33:51 回复(0)
//通过题目数据知道考点是斐波那契数列的考察

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int from, to;
    while(cin >> from >> to)
    {
        vector<long long> v(81, 0);//long long保存数据
        v[1] = v[2] = 1;
        for(int i = 3; i < 82; i++)
            v[i] = v[i - 1] + v[i - 2];
        long long ans = 0;
        for(int i = from; i <= to; i++)
            ans += v[i];
        
        cout << ans << endl;
    }
    return 0;
}

发表于 2021-11-17 21:15:40 回复(0)