problem1 link

用$f[i][0],f[i][1]$表示从$i$位置开始Alice是先手是否可以胜利,是后手是否可以胜利。

problem2link

每次钱数够$price$时可以选择使得$n$或者$k$中较小的一个增加1。最多也就增加$2*10^{6}$次。钱数不够$price$时可以直接算出还要多少次可以够$price$。每一次也可以直接计算出不再变化$n,k$而直接挣够$target$时的次数。

problem3 link

如果$k$足够大,最后一定是在某一个区间$[L,R]$循环。当从左到右到达$R$之后,其要选择的循环的$L$一定是满足使得$sum(i,R)$最大的$i$。

那么现在就是应该尽快第一次到达$R$。

设$minTime[i],maxScore[i]$表示从0到达$i$并且下一次应该朝左时最小次数,以及在次数最小情况下最大的分数。

那么每次到达$i$时,一定是在$i$进行了若干次循环$[x,i]$后,从$i$到达了后面的某个$j$。在$i$循环的次数就是满足到达$j$不为负值的最小值。

code for problem1

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class OrderedNim { public String winner(int[] layout) {
final int n = layout.length;
boolean s0 = true;
boolean s1 = false;
for (int i = n - 2; i >= 0; --i) {
boolean t0, t1;
if (layout[i] == 1) {
t0 = s1;
t1 = s0;
}
else {
if (s0 || s1) {
t0 = true;
t1 = false;
}
else {
t0 = false;
t1 = true;
}
}
s0 = t0;
s1 = t1;
}
if (s0) {
return "Alice";
}
return "Bob";
}
}

  

code for problem2

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class StrongEconomy { public long earn(long n, long k, long price, long target) {
if (n >= (target + k - 1) / k) {
return 1;
}
long result = Long.MAX_VALUE;
long usedDays = 0;
long sum = 0;
while (n * k < target) {
long speed = n * k;
result = Math.min(result, usedDays + (target - sum + speed - 1) / speed);
if (sum < price) {
long d = (price - sum + speed - 1) / speed;
sum += speed * d;
usedDays += d;
}
sum -= price;
if (n < k) {
++n;
}
else {
++k;
}
}
result = Math.min(result, usedDays + 1);
return result;
}
}

  

code for problem3

import sun.rmi.runtime.Log;

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class RowGame { public long score(int[] board, int k) {
final int n = board.length; long[] lmax = new long[n];
for (int i = 0; i < n; ++ i) {
lmax[i] = Long.MIN_VALUE;
long s = 0;
for (int j = i; j >= 0; --j) {
s += board[j];
lmax[i] = Math.max(lmax[i], s);
}
} long[] minTimes = new long[n];
long[] maxScore = new long[n];
long tmp = 0;
for (int i = 0; i < n; ++i) {
minTimes[i] = Long.MAX_VALUE;
tmp += board[i];
if (tmp >= 0) {
minTimes[i] = 1;
maxScore[i] = tmp;
}
} long result = 0;
for (int i = 0; i < n; ++i) {
if (minTimes[i] > k) {
continue;
}
result = Math.max(result, maxScore[i] + lmax[i] * (k - minTimes[i]));
if (lmax[i] <= 0) {
continue;
}
tmp = maxScore[i];
for (int j = i + 1; j < n; ++j) {
tmp += board[j];
long t = (- tmp + 2 * lmax[i] - 1)/(2 * lmax[i]);
if ( t <= 0) {
t = 1;
}
long newTimes = minTimes[i] + t * 2;
long newScore = tmp + lmax[i] * t * 2;
if (minTimes[j] > newTimes || minTimes[j] == newTimes && maxScore[j] < newScore) {
minTimes[j] = newTimes;
maxScore[j] = newScore;
}
}
}
return result;
}
}

  

最新文章

  1. 在Gridview如何进行每行单元格比较
  2. springMVC+mybatis 增删该操作后判断影响行数一直返回-2147482646
  3. 2013长沙 G Graph Reconstruction (Havel-Hakimi定理)
  4. Linux系统下Redis安装(一)
  5. paip.配置ef_unified_filter() failed ext_filter_module mod_ext_filter.so apache 错误解决
  6. HDU 1896 Stones --优先队列+搜索
  7. Lines演示程序
  8. php学习测试题目
  9. javascript数据类型之Array类型
  10. 小甲鱼OD学习第13-14讲
  11. 《R语言入门与实践》第三章:R 对象
  12. js 事件对象
  13. Python debug 调试;
  14. vue 开发系列(七) 路由配置
  15. django-xss攻击原理与防范
  16. 深入浅出etcd系列Part 1 – etcd架构和代码框架
  17. Spark版本发布历史,及其各版本特性
  18. DDoS防护之TCP防护
  19. Linux下onvif客户端获取h265 IPC摄像头的RTSP地址
  20. html中title属性换行实现

热门文章

  1. linux du查看文件所占大小
  2. DataGridView控件用法合集
  3. Spark Streaming 002 统计单词的例子
  4. mysql优化(二)
  5. Springboot杂七杂八
  6. MyEclipse 黑色主题 jsp 页面 js背景色修改
  7. MVC中的Ajax与增删改查(二)
  8. cvc-complex-type.3.2.2: 元素 &#39;constructor-arg&#39; 中不允许出现属性 &#39;name&#39;
  9. 吴恩达讲了干货满满的一节全新AI课,全程手写板书充满诚意非常干货
  10. eclipse中的tomca的编辑页面server location灰色