当前位置: 首页 > news >正文

hdu 5623 KK's Number(dp)

问题描述
我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1N5104​​)个数,每次KK都会先拿数。每次可以拿任意多个数,直到NN个数被拿完。每次获得的得分为取的数中的最小值,KK和对手的策略都是尽可能使得自己的得分减去对手的得分更大。在这样的情况下,最终KK的得分减去对手的得分会是多少?
输入描述
第一行一个数T\left( 1\leq T\leq 10\right)T(1T10),表示数据组数。 对于每组数据包含两行,第一行一个整数N\left(1\leq N\leq 5*{10}^{4} \right)N(1N5104​​),表示个数,第二行NN个正整数(不超过{10}^{9}109​​)。
输出描述
对于每一个数据输出一个整数,表示最终KK的得分减去对手的得分。
输入样例
1
3
1 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<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<math.h>
 7 #include<algorithm>
 8 #include<queue>
 9 #include<set>
10 #include<bitset>
11 #include<map>
12 #include<vector>
13 #include<stdlib.h>
14 using namespace std;
15 #define ll long long
16 #define eps 1e-10
17 #define MOD 1000000007
18 #define N 60000
19 #define inf 1e12
20 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<n;i++){
29             scanf("%d",&a[i]);
30         }
31         sort(a,a+n);
32         
33         int ans=0;
34         for(int i=0;i<n;i++){
35             ans = max(ans,a[i]-ans);
36             a[i]=ans;
37         }
38         printf("%d\n",ans);
39     }
40     return 0;
41 }
View Code

 

 

 

 

 

相关文章:

  • 【阅读源码系列】HashMap源码分析(JDK1.7和JDK1.8)
  • 使用开源的PullToRefreshScrollView scrollTo和scrollby遇到的问题
  • 【阅读源码系列】ThreadPoolExecutor源码
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • YII 路由配置
  • 讲一下ISO七层模型?
  • Python 17.1 HTTP协议简介
  • 培训机构出来的iOS学员怎么了?
  • 输入url(网址)之后到显示网页的过程?
  • Java中的陷阱题
  • Host文件?
  • js阻止表单重复提交
  • 为什么要域名解析?
  • Providers、Controller 、Service、DirectiveFactory
  • DNS查找详细过程
  • $translatePartialLoader加载失败及解决方式
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Apache的基本使用
  • bootstrap创建登录注册页面
  • create-react-app项目添加less配置
  • EventListener原理
  • extract-text-webpack-plugin用法
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • Python连接Oracle
  • QQ浏览器x5内核的兼容性问题
  • SegmentFault 2015 Top Rank
  • Terraform入门 - 3. 变更基础设施
  • 对象管理器(defineProperty)学习笔记
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 如何使用 JavaScript 解析 URL
  • 使用putty远程连接linux
  • 微信小程序开发问题汇总
  • 为什么要用IPython/Jupyter?
  • 学习使用ExpressJS 4.0中的新Router
  • 阿里云API、SDK和CLI应用实践方案
  • ​queue --- 一个同步的队列类​
  • ​马来语翻译中文去哪比较好?
  • #Z2294. 打印树的直径
  • #微信小程序(布局、渲染层基础知识)
  • (6)STL算法之转换
  • (windows2012共享文件夹和防火墙设置
  • (八)Spring源码解析:Spring MVC
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (五)c52学习之旅-静态数码管
  • ******之网络***——物理***
  • .apk 成为历史!
  • .net core 依赖注入的基本用发
  • .Net IOC框架入门之一 Unity
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】