51nod 1839 Lin的游戏

2024-03-27 02:20
文章标签 游戏 51nod lin 1839

本文主要是介绍51nod 1839 Lin的游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1839 Lin的游戏

  • 1.0 秒
  • 131,072.0 KB
  • 160 分
  • 6级题

在51nod上面一道冷门题
观前提示:本文章内使用的编程语言是c++,且代码毫无可读性就像爪子用狗刨的,请慎重观看

首先我们可以知道以下信息:

  • 根据数据范围n*d+6位小数=17位,所以需要开long\ double
  • 限时为1s,所以最差时间复杂度为O(nlogn)
  • Lin只知道自己在当前回合所选的数字在所有已选过的数字里有多大
  • Lin的选择只和当前回合的状态有关系,和之前的什么关系也没有
  • 如果一直移除,那么最后得分期望就是\frac{d(n-1)}{2}+a

基础版(12/20)

期望,动态规划,前缀和

我们可以设dp[i]为第 i 回合结束游戏时的期望得分
那么dp[n]=\frac{d(n-1)}{2}+a
我们就从n-1开始往下推到1

以最大期望为例:

对于每个回合,决定一个阈值k,倘若此回合选中的数字大小排名小于 k,就结束游戏,否则就继续下一回合。
众所周知,从题目中的数字中选出 i 个数字中第 j 大的数字的值期望f=a-d+\frac{d(i-j+1)(n+1)}{i+1}
不信自己推
Lin在这一回合决策停止游戏的得分贡献值\Delta =\sum_{j=1}^{k}\frac{f_j}{i}
这里的\Delta可以用前缀和来弄

此时继续进入下一回合的概率为p=1-k/i

综合亿下dp[i]=\Delta+p\cdot dp[i+1]
另一种期望则按平均值取反

代码O(n²):
#include<bits/stdc++.h>
using namespace std;
long long n,d,a,k;
double c[1002356],dp[1002356];
int main()
{cin>>n>>d>>a;dp[n]=((n-1)*d+2*a)/2.0;for(int i=n-1;i>0;i--){for(int j=1;j<=i;j++)c[j]=c[j-1]+1.0/i*(a-d+((i-j+1)*(n+1)*d)/(i+1.0));for(int k=0;k<=i;k++)dp[i]=max(dp[i],c[k]+(1-(double)k/i)*dp[i+1]);}printf("%.6lf\n%.6lf",2*a+(n-1)*d-dp[1],dp[1]);return 0;
}

别问我为什么不用long\ double,因为这样会再少得2个点

膏级版(14/20)

膏斯求和

不难看出,f=a-d+\frac{d(i-j+1)(n+1)}{i+1}中只有一个分子j是改变的,所以可以用膏斯求和来求\Delta的值
经简化,得\Delta =\frac{k(a-d)+\frac{k(2i-k+1)}{2}\cdot \frac{d(n+1)}{i+1}}{i}
不信自己推

dp[i]照样

代码O(n²):
#include<bits/stdc++.h>
using namespace std;
long long n,d,a,k;
double dp[1002356];
int main()
{cin>>n>>d>>a;dp[n]=((n-1)*d+2*a)/2.0;const long long f=a-d,g=(n+1)*d;for(int i=n-1;i>0;i--){const double p=1.0/i,q=g/(i+1.0);for(int k=0;k<=i;k++)dp[i]=max(dp[i],k*(2*i-k+1)*0.5*p*q+f+(1-(double)k*p)*(dp[i+1]-f));}printf("%.6lf\n%.6lf",2*a+(n-1)*d-dp[1],dp[1]);return 0;
}

虽然这样得分还是0,但这两个点的意义你看到下面就懂了

满分版(20/20)

双调数组,二分

由前面的分析可得:
在k的循环中

  • f_j是递减的,所以\Delta _k减速递增
  • p_k\cdot dp[i+1]是等差数列

所以dp[i]_k是双调(即中间最大,两边依次减小的)数列

这时就可以用二分,每次选择连续2个数据,更小的所在的那一边就可以排掉了

代码O(nlogn):

#include<bits/stdc++.h>
#define ll long long
#define ld long double
using namespace std;
ll n,d,a;
ld dp[1002356];
int main()
{cin>>n>>d>>a;dp[n]=((n-1)*d+2*a)/2.0;const ll f=a-d,g=(n+1)*d;for(int i=n-1;i>0;i--){const ld p=1.0/i,q=g/(i+1.0)*0.5,s=dp[i+1]-f;ll l=0,r=i,k;ld c,e;while(l<r){k=(l+r)/2;c=k*(2*i-k+1)*p*q+f+(1-k*p)*s;k++;e=k*(2*i-k+1)*p*q+f+(1-k*p)*s;if(c<=e)l=k;else r=k-1;}dp[i]=l*(2*i-l+1)*p*q+f+(1-l*p)*s;}printf("%.6Lf\n%.6Lf",2*a+(n-1)*d-dp[1],dp[1]);
}

//尸米山代码,不喜勿喷

这篇关于51nod 1839 Lin的游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850642

相关文章

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

nyoj 1038 纸牌游戏

poj 的一道改编题,说是翻译题更恰当,因为只是小幅度改动。 一道模拟题,代码掌控能力比较好,思维逻辑清晰的话就能AC。 代码如下: #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct node{char c[5];int rk;char da[5];int nu

如果出一个名叫白神话悟空的游戏

最近黑神话由于与原著不符引起了原著派的争议。 所以我在摸鱼的时候想到如果游科或者某个别的公司“痛改前非”不夹带私货完全复刻吴承恩百回版剧情制作一个“重走西游路”的游戏,会有一个什么样的销量?(设定为原著派已经多方渠道认证,此游戏的确没有夹带私货,绝大部分复刻了原著剧情) 游戏玩法我想了几类 超长线性有岔路蜈蚣形状地图,蜈蚣的腿部是探索区域和支线,重走西游路线,开篇就是开始取经前唐玄宗御弟cg

《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂》可以在苹果Mac电脑上玩吗?

在宏大的世界观游戏中,《黑暗之魂2:原罪学者》脱颖而出,以其探索性和挑战性征服了全球玩家的心灵。下面我们来看看《黑暗之魂2:原罪学者》是什么类型的游戏,《黑暗之魂2:原罪学者》可以在苹果电脑玩吗的相关内容。 一、《黑暗之魂2:原罪学者》是什么类型的游戏 《黑暗之魂2:原罪学者》作为《黑暗之魂2》的增强版和重制版,是一款FromSoftware制作、BANDAI NAMCO和FromSoft

简单取石子游戏~博弈

很坑爹的小游戏,至于怎么坑爹,嘎嘎~自己研究去吧~! #include<stdio.h>#include<windows.h>#include<iostream>#include<string.h>#include<time.h>using namespace std;void Loc(int x,int y);/*定位光标*/void Welcome(); /*创建欢迎界面*/

黑神话:悟空》增加草地绘制距离MOD使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验

《黑神话:悟空》增加草地绘制距离MOD为玩家提供了一种全新的视觉体验,通过扩展游戏中草地的绘制距离,增加了场景的深度和真实感。该MOD通过增加草地的绘制距离,使游戏场景看起来更加广阔与自然,增强了游戏的沉浸式体验。 增加草地绘制距离MOD安装 1、在%userprofile%AppDataLocalb1SavedConfigWindows目录下找到Engine.ini文件。 2、使用记事本编辑

Unity3D在2D游戏中获取触屏物体的方法

我们的需求是: 假如屏幕中一个棋盘,每个棋子是button构成的,我们希望手指或者鼠标在哪里,就显示那个位置的button信息。 网上有很多获取触屏物体信息的信息的方法如下面代码所示: Camera cam = Camera.main; // pre-defined...if (touch.phase == TouchPhase.Bagan)){ // 如果触控点状态为按下Ray