1. 程式人生 > >codeforces 735C Tennis Championship(貪心+遞推)

codeforces 735C Tennis Championship(貪心+遞推)

題目 -1 long 想要 參加 ges esp c代碼 return

Tennis Championship

題目鏈接:http://codeforces.com/problemset/problem/735/C

    ——每天在線,歡迎留言談論。

題目大意:

給你一個 n (2≤n≤10^18),代表一共有n位參加比賽的選手。

遊戲規則:

①每次比賽,輸的選手將離開賽場

②相互比賽的選手 他們的獲勝的次數相差不能超過1(獲勝4次的選手只能跟3或5次的選手比賽)

問題:最終贏得比賽的選手,勝場最多能為多少。

思路:

貪心:①選一名選手讓他一直獲勝且優先讓他參加比賽

②當沒有可比賽選手的時候(比如他勝為2時,其他選手勝場為0),就讓另一個人的勝場達到比他少一場(恰好可以比賽),然後比賽輸掉.

遞推:

技術分享

意思:產生一名勝場為x的選手,需要有y名選手出局

規律例:想要獲得一勝5次的選手 需要 一名4次的選手+一名3次的選手 然後比賽後前者獲勝後者出局。

n[i]=n[i-1]+n[i-2]+1(1為獲勝 i-1 次的選手出局)

那麽 : 答案就是n-1>=y對應的那個x對大的那個嘍

AC代碼:

 1 #include <iostream>
 2 using namespace std;
 3 typedef long long ll;
 4 ll a[91]={0,1};
 5 int main()
 6 {
 7     for(int i=2;i<=90;i++)
8 {a[i]=a[i-1]+a[i-2]+1;} 9 ll n; 10 cin>>n; 11 n-=1; 12 for(int i=1;i<=90;i++) 13 if(n<a[i]) 14 { 15 cout<<i-1<<endl; 16 return 0; 17 } 18 //通過計算a[90]已經為 7e18多了,為題目給定n 的3倍多! 19 cout<<"90"<<endl;
20 return 0; 21 }

2017-05-27 19:25:29

codeforces 735C Tennis Championship(貪心+遞推)