0分求助

P1011 [NOIP1998 提高组] 车站

@ lzj20110120 100太小了 有两种解法
by Wangxiaolong666 @ 2024-02-05 09:33:24


``` #include<bits/stdc++.h> using namespace std; /* int main() { long long a,n,m,x,s[10000],r[10000]; cin>>a>>n>>m>>x; if(x==1||x==2) { cout<<a; return 0; } s[1]=a; r[1]=a; r[2]=a; int i=0; while(1) { s[2]=i; for(int j=3;j<n;j++) { s[j]=s[j-1]+s[j-2]; r[j]=r[j-1]+s[j-2]; } if(r[n-1]==m) { cout<<r[x]; return 0; } i++; if(i==1000) break; } return 0; } */ //########################################################## //########################################################## /* int main() { long long a,n,m,x,s1[10000],s2[10000]; cin>>a>>n>>m>>x; if(x==1) { cout<<a; return 0; } if(x==n) { cout<<0; return 0; } s1[2]=1,s1[3]=2; for(int i=4;i<n;i++) { s1[i]=s1[i-1]+s1[i-2]-1; s2[i]=s2[i-1]+s2[i-2]+1; } long long b=(m-a*s1[n-1])/s2[n-1]; cout<<a*s1[x]+b*s2[x]; return 0; } */ ```
by Wangxiaolong666 @ 2024-02-05 09:34:08


```cpp //解题关键:动态规划+简单数学公式 #include<iostream> using namespace std; int C[21]; //设在第二站上车或下车的人数为k //k为本题解题关键 int main() { int a, n, m, x; cin >> a >> n >> m >> x; C[0] = 0; C[1] = 1; //类似斐波那契数列 for (int i = 2; i < n - 1; i++) { C[i] = C[i - 1] + C[i - 2]; } int k = 0; //简单的数学公式推理,解出k值 k = (m- a - C[n - 3] * a) / (C[n - 2]-1); //x站的人数公式:C[x - 2] * a + k * C[x - 1]+a-k cout << C[x - 2] * a + k * C[x - 1]+a-k; return 0; }
by swuster27 @ 2024-02-15 21:45:58


|