第一行:N
第2至N+1行:每行一个数,代表糖果数
一个数,请输出胜利者比失败者多拿多少糖果
4 1 55 41 2
15
小明先选择55,此时环从55处断开,变为序列[41, 2, 1]
小红选择行首的41,此时剩余的序列为[2, 1]
小明选择行首的2,此时剩余的序列为[1]
小红选择剩余的1。
此时小明胜利,比小红多15个糖果
n=int(input())nums=[]fori inrange(n):tmp=int(input())nums.append(tmp)defWin(num):n=len(num)dp=[[0]*n for_ inrange(n)]forl inrange(n):fori inrange(n-l):j=i+lifl<=1: dp[i][j]=max(num[i],num[j])else:dp[i][j]=max(min(dp[i+1][j-1],dp[i][j-2])+num[j],min(dp[i+2][j],dp[i+1][j-1])+num[i])return-sum(num)+2*dp[0][n-1]res=0fori inrange(n):index=inum=nums[index+1:]+nums[:index]res=max(res,nums[i]-Win(num))print(res)
#include <bits/stdc++.h> using namespace std; int F(int *a, int n){ int dp[n][n],s=0; memset(dp,0,sizeof(0)); for(int k=0;k<n;k++){ for(int i=0;i<n-k;i++){ int j=i+k; if(k<=1) dp[i][j] = max(a[i], a[j]); else dp[i][j] = max(min(dp[i+1][j-1], dp[i][j-2])+a[j], min(dp[i+2][j], dp[i+1][j-1])+a[i]); } } for(int i=0;i<n;i++) s += a[i]; s = 2*dp[0][n-1]-s; return s; } int main(){ int n; cin>>n; int a[n]; for(int i=0;i<n;i++) cin>>a[i]; int s = 0; for(int i=0;i<n;i++){ int b[n-1],k=0; for(int j=i+1;j<n;j++) b[k++] = a[j]; for(int j=0;j<i;j++) b[k++] = a[j]; s = max(s, a[i]-F(b, n-1)); } cout<<s<<endl; return 0; }
dic={} def res(ary): if not ary: return 0 if not ary in dic: dic[ary]=min(-res(ary[1:])-ary[0],-res(ary[:-1])-ary[-1])#对于对手来说,对手得分是负的自己得分 return dic[ary] a=int(input()) aa=[int(input()) for _ in range(a)] print (abs(max([-res(tuple(aa[i:]+aa[:i])) for i in range(a)])))
def PredictTheWinner(nums): n = len(nums) dp = [[0] * n for _ in range(n)] for i in range(n): dp[i][i] = nums[i] for a in range(1,n): for b in range(n-a): i = b j = b+a dp[i][j] = max(nums[i] - dp[i + 1][j], nums[j] - dp[i][j - 1]) return dp[0][-1] nums = [] n = int(input()) for i in range(n): nums.append(int(input())) maxv = -1000000 for i in range(n): res = nums[i+1::]+nums[0:i] temp = nums[i]-PredictTheWinner(res) if temp>maxv: maxv = temp print(maxv)
(1758)#include <bits/stdc++.h> using namespace std; vector<vector<int>> dp; vector<int> nums; int n; int dfs(int st, int ed){ if(dp[st][ed] != -1) return dp[st][ed]; if(st == ed) return nums[st]; int x = nums[st] - dfs((st-1+n)%n, ed); int y = nums[ed] - dfs(st, (ed+1)%n); int cur; cur = max(x, y); return dp[st][ed] = cur; } int main(){ scanf("%d", &n); nums = vector<int>(n); for(int i=0; i<n; i++){ scanf("%d", &nums[i]); } dp = vector<vector<int>>(n, vector<int>(n, -1)); int maxn = 0; for(int i=0; i<n; i++){ int cur = nums[i] - dfs((i-1+n)%n, (i+1)%n); maxn = max(cur, maxn); } cout << maxn << endl; return 0; }
import random def d_candy(time,array): xm,xh,arr = 0,0,[] l_len = len(array) xm = random.choice(array) # 小明随机取第一盒糖果 for i in range(0,l_len): if xm == array[i]: if i == 0: arr = array[1:] elif i == l_len: arr =array[0:l_len-2] # 小明如在 [1,55,41,2,10,5,3]队首、队尾取的时候,进行的处理 else: j = i while j < (l_len -1): j += 1 arr.append(array[j]) j = 0 while j < i: arr.append(array[j]) j += 1 # 对形成的队列进行重新排序 l_len1 = len(arr) k = 0 while l_len1 != 0: if k%2 == 0: r = random.choice([-1,0]) a = arr[r] xh += a del arr[r] l_len1 -= 1 k += 1 else: r = random.choice([-1,0]) b = arr[r] xm += b del arr[r] l_len1 -= 1 k += 1 if (xm - xh) > 0: print("小明获胜:") return xm - xh else : print("小红获胜:") return xh - xm arry = [] m = int(input()) for i in range(m): a = int(input()) arry.append(a) print(d_candy(m,arry)) # 本地运行正常