2018招商银行笔试题——团建活动
生活随笔
收集整理的這篇文章主要介紹了
2018招商银行笔试题——团建活动
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目大意:一排人站成一隊(duì),共有n個(gè)人,每個(gè)人有各自的身高,用一個(gè)數(shù)組表示。然后AB兩個(gè)人參與游戲,每次可以從隊(duì)伍最左側(cè)選擇一個(gè)或者兩個(gè)人加入自己的隊(duì)列,最后將兩人的隊(duì)列的人的身高總和進(jìn)行比較,總和大的人獲得勝利,A先手,且A和B每個(gè)人都足夠機(jī)智(每手都是最優(yōu)),求A是否可以必勝。
首先這題只是看上去像個(gè)博弈,但是由于每個(gè)人的身高不同(題目并沒有給出身高范圍,理論上可以出現(xiàn)一個(gè)人頂其它人總和的情況),所以博弈很難解決。
由于兩人都是足夠機(jī)智的,所以可以用dp[i]表示從位置i取可以獲得的最大值(A和B都可以表示),而隊(duì)伍末尾的值可以確定,即dp[n]=n;所以可以從最后進(jìn)行反推,狀態(tài)轉(zhuǎn)移方程為:
dp[i]=max(a[i]+sum[n]-sum[i]-dp[i+1],a[i]+a[i+1]+sum[n]-sum[i+1]-dp[i+2]);
(sum[i]表示隊(duì)列從1到i的身高總和)
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> using namespace std; int main(){int n;int a[10000];int dp[10000];int sum[10000];scanf("%d",&n);memset(dp,0,sizeof(dp));memset(sum,0,sizeof(sum));for(int i=1;i<=n;i++){scanf("%d",&a[i]);sum[i] = sum[i-1]+a[i];}dp[n]=n;for(int i=n-1;i>=1;i--){dp[i]=max(a[i]+sum[n]-sum[i]-dp[i+1],a[i]+a[i+1]+sum[n]-sum[i+1]-dp[i+2]);}if(dp[1]>dp[2]||dp[1]>dp[3]){puts("true");}else{puts("false");}return 0; }總結(jié)
以上是生活随笔為你收集整理的2018招商银行笔试题——团建活动的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: device mapper机制详解
- 下一篇: 使用jquery处理多选框checkbo