笨蛋的难题(二)
笨蛋就業了,并且是在上千應聘中脫穎而出的,和他一起脫穎而出的還有傻子。公司的老板對二人視為珍寶,為了激勵他們的工作熱情,給他們一小時發一次工資(很高興吧)。但每次只發給一個人,并且每次發的工資可能不同(老板很厲害吧)。傻子和笨蛋為了證明自己比對方智商高,他們事先知道每次發的工資的多少。他們暗中達成協議:他們不是將工資平分,而是輪流領取。該領工資的人可以選擇跳過一個或多個小時的工資,而領取后面的工資。跳過的工資會捐給孤兒院。他們只管自己獲得最大利益,不管對方獲得的利益如何,每次笨蛋先領。比如 100, 100, 800, 70, 150 ,100。笨蛋第一個小時不領,第二個小時也不領,直接領第三個小時發的工資,傻子領第四個小時發的工資,笨蛋再領第五個小時發的工資,傻子再領第六個小時發的工資,這樣笨蛋領到950元的工資,傻子領到170元的錢,其余的全部捐給孤兒院為200元。
第一行輸入t,表示共發t個小時的工資(0<t<120)
接下來一行是t個數表示t小時內每個小時的工資Money(0<money<10000)
他們分別表示笨蛋領的工資,傻子領的工資,還有捐給孤兒院的錢
Input
多組測試數據第一行輸入t,表示共發t個小時的工資(0<t<120)
接下來一行是t個數表示t小時內每個小時的工資Money(0<money<10000)
Output
三個數字M,N,V他們分別表示笨蛋領的工資,傻子領的工資,還有捐給孤兒院的錢
Sample Input
6 100 100 800 70 150 100 3 100 100 100Sample Output
950 170 200 200 100 0 利用dp和貪心的思想;AC代碼:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int main() {int t,sum;int M,N,V;int i,j;int dp[130];while(cin>>t){sum=0;for(i=0;i<t;i++){cin>>dp[i];sum+=dp[i];}M=N=0;for(i=t-1;i>-1;i--){if(dp[i]+M>=N){ //輪換選取最大值,滿足條件更新 V=N;N=dp[i]+M;M=V;}}cout<<N<<" "<<M<<" "<<sum-M-N<<endl;}return 0; }總結
- 上一篇: JEECG寒假集训班开始报名啦!
- 下一篇: nodejs项目如何部署到服务器上?