D - Frog and Portal 构造题

链接:https://vjudge.net/contest/394916#problem/D

具体思路:利用斐波那契数列的性质,斐波那契数列可以构成任何正整数,所以按照顺序减下去肯定能减到0.

斐波那契数列  1 1 2 3 5 8 13 21 。。。。。比如说给你一个20,先减去13,还剩7,然后再减去5,然后再减去2,这样就行了。

并且减去的位置不是相邻的。对于这个题来说,要反着思考,从第199到200有一种跳法,从198到200有两种跳法,依次往下递归就可以了。这样有什么好处?防止传送门的安置会对后面的荷叶上的跳法产生影响,比如说在3处安放了一个传送门,那么到达5的跳法就会受到影响,而反向的话就可以避免这种情况,在后面安防传送门并不会对再后面的产生影响,然后建立传送门的时候,记录一下,然

后分别连向1 3 5 等等就可以了,然后再再结束的地方安置一个无线循环的门就可以了。

 1 #include<iostream>
 2 #include<stdio.h>
 3 using namespace std;
 4 # define ll long long
 5 ll a[100000+1999];
 6 ll road[100000+1999];
 7 int main()
 8 {
 9     ll n;
10     a[200]=1;
11     a[199]=1;
12     for(int i=198; i>=150; i--)
13     {
14         a[i]=a[i+1]+a[i+2];
15     }
16     while(~scanf("%lld",&n))
17     {
18         ll num=0;
19         if(n==0)
20         {
21             printf("2\n1 1\n2 1\n");
22         }
23         else
24         {
25             for(int i=150; i<=200; i++)
26             {
27                 if(n==0)break;
28                 if(n-a[i]>=0)
29                 {
30                     road[++num]=i;
31                     n-=a[i];
32                 }
33             }
34             printf("%d\n",num+1);
35             for(int i=1; i<=num; i++)
36             {
37                 printf("%d %d\n",i*2-1,road[i]);
38             }
39             printf("%d %d\n",num*2,num*2);
40         }
41     }
42     return 0;
43 }

 

posted @ 2020-09-26 22:35  古比  阅读(237)  评论(0编辑  收藏  举报