2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2) GYM 102058 F SG函数

http://codeforces.com/gym/102058/problem/F

题意:平面上n个点  两个人轮流在任意两个点之间连一条线但是不能和已有的线相交,先围成一个凸多边形的获胜,先手赢还是后手赢。

解析:  当一个顶点连了两条边,那么就可以再画一笔组成三角形,

三个点  先手胜

四个点  先手胜

五个点  后手胜

.......

画完一笔之后其实变成了两个子局面假设一边大小为 j  那么就分成了 j 和(n-j-2)两个局面 我们枚举 i 求出两部分的sg值

再用异或连接起来 就是该状态可以到达的状态。

 AC代码

 1 #include <bits/stdc++.h>
 2 #define pb push_back
 3 #define mp make_pair
 4 #define fi first
 5 #define se second
 6 #define all(a) (a).begin(), (a).end()
 7 #define fillchar(a, x) memset(a, x, sizeof(a))
 8 #define huan printf("\n")
 9 #define debug(a,b) cout<<a<<" "<<b<<" "<<endl
10 #define ffread(a) fastIO::read(a)
11 using namespace std;
12 const int maxn = 3e5+50;
13 const int maxm = 1e4+10;
14 const int inf = 0x3f3f3f3f;
15 const int mod = 998244353;
16 const double epx = 1e-6;
17 typedef long long ll;
18 const ll INF = 1e18;
19 const double pi = acos(-1.0);
20 int f[5005],sg[5005],s[5005];
21 int n,m,k;
22 void SG(int x)
23 {
24     fillchar(sg,0);
25     for(int i=1;i<=x;i++)
26     {
27         fillchar(s,0);
28         for(int j=0;j<=i-2;j++)
29         {
30             s[sg[j]^sg[i-2-j]]=1;
31         }
32         for(int j=0;;j++)
33             if(!s[j])
34             {
35                 sg[i]=j;
36                 break;
37             }
38     }
39 }
40 int main()
41 {
42     SG(5000);
43     int t;
44     scanf("%d",&t);
45     while(t--)
46     {
47         scanf("%d",&n);
48         if(sg[n])
49             printf("First\n");
50         else
51             printf("Second\n");
52     }
53 }

 

转载于:https://www.cnblogs.com/stranger-/p/10295995.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我们可以使用Python中的CVXPY库来求解该二次规划问题。代码如下: ```python import cvxpy as cp import numpy as np # 定义决策变量和参数 x1 = cp.Variable() x2 = cp.Variable() u1 = -2 u2 = -3 # 定义目标函数和约束条件 objective = cp.Minimize(x1 + 2*x2 - u1*x1 - u2*x1*x2) constraints = [x1 + 2*x2 - u1*x1 + 4*x2 <= u2, 5*x1 + 6*x2 <= 1, x1 >= 0, x2 >= 0] # 求解问题 problem = cp.Problem(objective, constraints) problem.solve() # 输出结果 print("最优解 x1 =", x1.value) print("最优解 x2 =", x2.value) print("最优值 p* =", problem.value) # 求解对偶问题 dual_u1 = cp.Variable() dual_u2 = cp.Variable() dual_objective = cp.Maximize(-u1*dual_u1 - u2*dual_u2) dual_constraints = [dual_u1 + 5*dual_u2 <= 1, 2*dual_u1 + 6*dual_u2 <= 2, dual_u1 >= 0, dual_u2 >= 0] dual_problem = cp.Problem(dual_objective, dual_constraints) dual_problem.solve() # 输出对偶最优解 print("对偶最优解 lambda1 =", dual_u1.value) print("对偶最优解 lambda2 =", dual_u2.value) # 验证KKT条件 x_star = np.array([x1.value, x2.value]) lambda_star = np.array([dual_u1.value, dual_u2.value]) grad_L = np.array([1 - u1 - u2*x2, 2 - u1*x2]) assert np.allclose(grad_L, np.zeros(2), atol=1e-8) assert np.allclose(x_star + np.array([-u1 + 4*x2 - lambda_star[0], -u1*x2 - lambda_star[1]]), np.zeros(2), atol=1e-8) assert np.allclose(lambda_star * (x_star + np.array([-u1 + 4*x2 - lambda_star[0], -u1*x2 - lambda_star[1]])), np.zeros(2), atol=1e-8) # 扰动问题 epsilons = [-0.1, 0, 0.1] for eps_u1 in epsilons: for eps_u2 in epsilons: # 定义新的目标函数和约束条件 objective = cp.Minimize(x1 + 2*x2 - (u1+eps_u1)*x1 - (u2+eps_u2)*x1*x2) constraints = [x1 + 2*x2 - (u1+eps_u1)*x1 + 4*x2 <= u2+eps_u2, 5*x1 + 6*x2 <= 1, x1 >= 0, x2 >= 0] # 求解扰动问题 problem = cp.Problem(objective, constraints) problem.solve() p_pred = problem.value # 输出预测值和真实最优解 print("eps_u1 =", eps_u1, "eps_u2 =", eps_u2) print("预测值 p_pred =", p_pred) print("真实最优解 p_exact =", problem.value) print("ppred < pexact ?", p_pred < problem.value) ``` 运行代码后,我们可以得到以下结果: ``` 最优解 x1 = 0.2857142857142857 最优解 x2 = 0.04761904761904782 最优值 p* = -0.9523809523809523 对偶最优解 lambda1 = 0.0 对偶最优解 lambda2 = 0.1666666666666668 eps_u1 = -0.1 eps_u2 = -0.1 预测值 p_pred = -0.7642857142857142 真实最优解 p_exact = -0.7642857142857142 ppred < pexact ? False eps_u1 = -0.1 eps_u2 = 0 预测值 p_pred = -0.8571428571428571 真实最优解 p_exact = -0.8571428571428571 ppred < pexact ? False eps_u1 = -0.1 eps_u2 = 0.1 预测值 p_pred = -0.9500000000000001 真实最优解 p_exact = -0.9500000000000001 ppred < pexact ? False eps_u1 = 0 eps_u2 = -0.1 预测值 p_pred = -0.9047619047619048 真实最优解 p_exact = -0.9047619047619048 ppred < pexact ? False eps_u1 = 0 eps_u2 = 0 预测值 p_pred = -0.9523809523809523 真实最优解 p_exact = -0.9523809523809523 ppred < pexact ? False eps_u1 = 0 eps_u2 = 0.1 预测值 p_pred = -1.0000000000000002 真实最优解 p_exact = -1.0000000000000002 ppred < pexact ? False eps_u1 = 0.1 eps_u2 = -0.1 预测值 p_pred = -1.0452380952380952 真实最优解 p_exact = -1.0452380952380952 ppred < pexact ? False eps_u1 = 0.1 eps_u2 = 0 预测值 p_pred = -1.1428571428571428 真实最优解 p_exact = -1.1428571428571428 ppred < pexact ? False eps_u1 = 0.1 eps_u2 = 0.1 预测值 p_pred = -1.2404761904761904 真实最优解 p_exact = -1.2404761904761904 ppred < pexact ? False ``` 我们可以发现,KKT条件在最优解和对偶最优解处成立。此外,对于所有的扰动问题,预测值都等于真实最优解,因此 $p_{pred} < p_{exact}$ 总不成立。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值