博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 5623 KK's Number(dp)
阅读量:6423 次
发布时间:2019-06-23

本文共 1383 字,大约阅读时间需要 4 分钟。

问题描述
我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗104)个数,每次KK都会先拿数。每次可以拿任意多个数,直到NN个数被拿完。每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大。在这样的情况下,最终KK的得分减去对手的得分会是多少?
输入描述
第一行一个数T\left( 1\leq T\leq 10\right)T(1≤T≤10),表示数据组数。 对于每组数据包含两行,第一行一个整数N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗104),表示个数,第二行NN个正整数(不超过{10}^{9}109)。
输出描述
对于每一个数据输出一个整数,表示最终KK的得分减去对手的得分。
输入样例
131 3 1
输出样例
2
Hint
首先KK取走3,然后对手取走两个1,那么最终分差为2。 题解:

首先,对数从小到大排序。

用dp[i]表示,当只有前i个数时,先取的人能够得到的分数差的最大值。 dp[0]=0

那么我们容易得到 

dp[1] = a[1]-dp[0].

dp[2] = max(a[2]-dp[1],a[1]-dp[0]) = max(a2-dp[1],dp[1]).

dp[3] = max(a[3]-dp[2],a[2]-dp[1],a[1]-dp[0]) = max(dp[2],a[3]-dp[2])

...

dp[i] = max(a[i]-dp[i-1],dp[i-1]).

计算的时间复杂度o(n),排序o(nlogn),总o(nlogn)

注意到 dp[i] 的计算只有到dp[i-1],因此不需要储存所有dp,对内存进行优化

 

 

AC代码:

1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #include
13 #include
14 using namespace std;15 #define ll long long16 #define eps 1e-1017 #define MOD 100000000718 #define N 6000019 #define inf 1e1220 int n;21 int a[N];22 int main()23 {24 int t;25 scanf("%d",&t);26 while(t--){27 scanf("%d",&n);28 for(int i=0;i
View Code

 

 

 

 

 

转载地址:http://kxrra.baihongyu.com/

你可能感兴趣的文章
Azure Media Service (1) 使用OBS进行Azure Media Service直播
查看>>
【转】c++ http下载文件
查看>>
matlab练习程序(水波特效)
查看>>
Ejabberd V.S Openfire
查看>>
【T03】理解私有地址和NAT
查看>>
手机和电话的验证
查看>>
jsp struts标签迭代各种数据
查看>>
alter system set events相关知识
查看>>
[Leetcode] Valid Sudoku
查看>>
Linux中使用crontab命令定时执行shell脚本或其他Linux命令
查看>>
Chrome开发工具Elements面板(编辑DOM和CSS样式)详解
查看>>
软件害死人
查看>>
MongoDB 之Java应用测试
查看>>
自动转向(Auto-Redirecting)技术
查看>>
缓存和字符串相互转换
查看>>
2018OKR年中回顾
查看>>
ArcGIS案例学习笔记-中国2000坐标转换实例
查看>>
[C# 基础知识系列]专题五:当点击按钮时触发Click事件背后发生的事情
查看>>
topcoder srm 490 div1
查看>>
TeeChart for vs 2005 破解
查看>>