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 }