>传送门<

题意:S(1)="COFFEE",S(2)="CHICKEN" ,S(n) = S(n−2)+S(n−1),请输出 S(n) 中从第 k 个字符开始的10个字符(若不足10个输出到末尾即可),(1≤n≤500,1≤k≤min(|S(n)|,1012)

思路:那会好多人过了这题,就尝试去写了一下,然而我处理的是区间,答案输出是对的,但是莫名其妙的段错误,可能用区间处理递归太多了吧,后来看到xjl学姐过了,她用for循环模拟的递归,是对十个位置上每个字符进行处理,仔细想想,这样写的确比我的要好,太弱了,连递归都写不好~T_T 以下来自官方题解

f(i) 表示 S(i) 的长度,f(i) = f(i−2) + f(i−1).

递归调用 solve(n,k) 表示 S(n) 的第 k 个字符,

n≤2 直接返回答案,

n>2 时,若 k>f(i−2),调用 solve(n−1,k−f(n−2))否则调用 solve(n−2,k).

注意特判 k>f(n).

Code

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. ll t, n, k;
  5. ll f[58] = {0,6,7};
  6. char s1[10] = "COFFEE", s2[10] = "CHICKEN";
  7. void dfs(int n, ll k){
  8. if(k>f[n]) return;
  9. if(n==1) printf("%c", s1[k-1]);
  10. else if(n==2) printf("%c", s2[k-1]);
  11. else {
  12. if(k>f[n-2]) dfs(n-1,k-f[n-2]);
  13. else dfs(n-2,k);
  14. }
  15. }
  16. int main()
  17. {
  18. for(int i=3;i<=57;i++) f[i]=f[i-1]+f[i-2];
  19. //for (int i = 1; i <= 57; i++) printf("%lld ", f[i]);
  20. scanf("%d",&t);
  21. while(t--){
  22. scanf("%d%lld", &n, &k);
  23. if(n>57)
  24. if(n&1) for(int i=0;i<10;i++) dfs(57,k+i);
  25. else for(int i=0;i<10;i++) dfs(56,k+i);
  26. else
  27. for(int i=0;i<10;i++) dfs(n,k+i);
  28. printf("\n");
  29. }
  30. return 0;
  31. }

至于为什么这里n只用计算到57,仔细看题目就知道k最大只能到1e12,因此n大到一定程度后,后面查找的其实还是用的前面的S(57)或者S(56),自己把f[i]打个表就知道了

学姐的代码:

  1. #include<stdio.h>
  2. #define ll long long
  3. #define MAXM 1000000000015L
  4.  
  5. ll T;
  6. ll len[505];
  7. char* s1 = "COFFEE";
  8. char* s2 = "CHICKEN";
  9. ll noww[15][5];
  10.  
  11. int main()
  12. {
  13. scanf("%lld", &T);
  14.  
  15. len[1] = 6;
  16. len[2] = 7;
  17. for(ll i = 3; i <= 500; i ++){
  18. len[i] = len[i - 1] + len[i - 2];
  19. if(len[i] > MAXM) len[i] = MAXM;
  20. }
  21.  
  22. while(T --){
  23. ll n, k;
  24. scanf("%lld%lld", &n, &k);
  25. for(int i = 0; i < 10; i ++){
  26. if(k + i <= len[n]){
  27. noww[i][0] = n;
  28. noww[i][1] = k + i;
  29. }
  30. else{
  31. noww[i][0] = 0;
  32. noww[i][1] = 0;
  33. }
  34. }
  35. for(int i = n; i >= 3; i --){
  36. for(int j = 0; j < 10; j ++){
  37. if(noww[j][0] == i){
  38. if(noww[j][1] <= len[i - 2])
  39. noww[j][0] = i - 2;
  40. else{
  41. noww[j][0] = i - 1;
  42. noww[j][1] = noww[j][1] - len[i - 2];
  43. }
  44. }
  45. }
  46. }
  47. for(int i = 0; i < 10; i ++){
  48. if(noww[i][0] == 1)
  49. printf("%c", s1[noww[i][1] - 1]);
  50. else if(noww[i][0] == 2)
  51. printf("%c", s2[noww[i][1] - 1]);
  52. }
  53. printf("\n");
  54. }
  55. return 0;
  56. }

2019牛客暑期多校训练营(第十场)B-Coffee Chicken的更多相关文章

  1. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  2. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  3. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  4. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  5. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  6. 2019牛客暑期多校训练营(第一场)A Equivalent Prefixes(单调栈/二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 Two arrays u and v each with m distinct elements ...

  7. [状态压缩,折半搜索] 2019牛客暑期多校训练营(第九场)Knapsack Cryptosystem

    链接:https://ac.nowcoder.com/acm/contest/889/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 2019牛客暑期多校训练营(第二场)J-Subarray(思维)

    >传送门< 前言 这题我前前后后看了三遍,每次都是把网上相关的博客和通过代码认真看了再思考,然并卵,最后终于第三遍也就是现在终于看懂了,其实懂了之后发现其实没有那么难,但是的的确确需要思维 ...

  9. 2019牛客暑期多校训练营(第一场)-A (单调栈)

    题目链接:https://ac.nowcoder.com/acm/contest/881/A 题意:给定两个长度均为n的数组a和b,求最大的p使得(a1,ap)和(b1,bp)等价,等价的定义为其任意 ...

  10. 2019牛客暑期多校训练营(第一场)A - Equivalent Prefixes(单调栈)

    题意 给定两个$n$个元素的数组$a,b$,它们的前$p$个元素构成的数组是"等价"的,求$p$的最大值."等价"的意思是在其任意一个子区间内的最小值相同. $ ...

随机推荐

  1. 【C++】《C++ Primer 》第十三章

    第十三章 拷贝控制 定义一个类时,需要显式或隐式地指定在此类型地对象拷贝.移动.赋值和销毁时做什么. 一个类通过定义五种特殊的成员函数来控制这些操作.即拷贝构造函数(copy constructor) ...

  2. Java JVM——9.方法区

    前言 方法区是运行时数据区的最后一个部分: 从线程共享与否的角度来看: 大家可能在这里有些疑惑,方法区和元空间的关系到底是怎样的?请往下看,下面会为大家解惑. 栈.堆.方法区的交互关系 下面就涉及了对 ...

  3. Java并发包源码学习系列:挂起与唤醒线程LockSupport工具类

    目录 LockSupport概述 park与unpark相关方法 中断演示 blocker的作用 测试无blocker 测试带blocker JDK提供的demo 总结 参考阅读 系列传送门: Jav ...

  4. 【数据结构与算法】Java制作一个简单数组类

    bobo老师的玩转算法系列–玩转数据结构 简单记录 文章目录 不要小瞧数组 - 制作一个数组类 1 .使用Java中的数组 数组基础 简单使用 2.二次封装属于我们自己的数组 数组基础 制作属于我们自 ...

  5. a[i][j] 和 a[j][i] 有什么区别?

    本文以一个简单的程序开头--数组赋值: int LEN = 10000;int[][] arr = new int[LEN][LEN]; for (int i = 0; i < LEN; i++ ...

  6. 【Docker】runtime create failed: container_linux.go:345: 解决

    ------------------------------------------------------------------------------------------------- | ...

  7. [mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

    转载自:http://www.cnblogs.com/joeblackzqq/p/4526589.html From: http://m.blog.csdn.net/blog/langkeziju/1 ...

  8. CSAPP:Lab1 -DataLab 超详解

    写在前面 之前考研的时候csapp的书有刷过5,6遍,所以对书本知识还算比较了解.恰逢最近在学c++的时候,顺带刷一下大名鼎鼎的csapp实验. 0. 环境准备 最好准备一个纯净的Linux系统这里建 ...

  9. 《进击吧!Blazor!》第一章 2.Hello Blazor

    第二次写专栏,开头还是不知道说什么,所以--先来段广告<进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门系列视频,此系列能让一个从未接触过Blazor的程序员掌握开发 ...

  10. 不用git 手动对比文件差异

    使用python脚本比较两个文件的差异内容并输出到html文档中,可以通过浏览器打开查看. 一.脚本使用 对比文件的差异 python python_diff_file.py -f1 web26.co ...