1. 程式人生 > >牛客網第九天的訓練

牛客網第九天的訓練

基礎題:童年生活二三事

題目描述:
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;	
}