牛客網第九天的訓練
阿新 • • 發佈:2018-11-24
基礎題:童年生活二三事
題目描述:
NowCoder小時候走路喜歡蹦蹦跳跳,他最喜歡在樓梯上跳來跳去。
但年幼的他一次只能走上一階或者一下子蹦上兩階。
現在一共有N階臺階,請你計算一下NowCoder從第0階到第N階共有幾種走法。
dp入門題,用dp[i]表示從第0階到第 i 階的走法,
因為每次只能跳一階或者兩階,所以第i階的跳法等於i-1階和i-2階跳法和,
即dp[i]=dp[i-1]+dp[i-2] 邊界為dp[1]=1,dp[2]=2
剛好是fibnacci,因為要跳到90階,所以應該開個long long int
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn = 91; long long int dp[maxn]; long long int fib(int n); int main() { memset(dp,0,sizeof(dp)); int n; while(cin>>n) { cout<<fib(n)<<endl; } return 0; } long long int fib(int n) { if(dp[n]) return dp[n]; if(n==1) { return dp[1]=1; } else if(n==2) { return dp[2]=2; } else { return dp[n]=fib(n-1)+fib(n-2); } return 0; }
進階題:牛牛偶像養成記
這個是個典型的貪心入門題,問題可以轉換為,在一個數軸上告訴你n個區間,問你能找出互不相交的最多區間有多少個。
首先,要按照每個表演的起始時間排序,然後第一個區間肯定必選。
#include<iostream> #include<algorithm> using namespace std; const int maxn = 1e5+4; struct node{ int x,y; }a[maxn]; bool cmp(node a,node b) { return a.x<b.x; } int main() { int n,ans,ed; while(cin>>n) { for(int i=0;i<n;++i) { cin>>a[i].x>>a[i].y; a[i].y+=a[i].x; } sort(a,a+n,cmp); ans=1,ed=a[0].y; //ed此刻為第一個表演的結束時間,之後為上一個選好的節目的結束時間 for(int i=1;i<n;++i) //從第二個表演一直到最後一個任務開始判斷 { if(a[i].y<=ed) //如果這個表演的結束時間<=ed,則表明選這個節目表演更優秀 { ed=a[i].y; //更新ed } else if(a[i].x>=ed) //如果這個表演的開始時間大於ed,則選定了之前的表演,更新答案和ed { ans++; ed=a[i].y; } } cout<<ans<<endl; } return 0; }