传送门

分析

首先不难想到O(k)做法,即dpi表示进行了几次,但复杂度明显爆炸,所以思考更优做法。我们发现数字个数很小,仅为可怜的50,所以从这里找突破口。我们发现每次可以在一个固定区域内进行刷分活动,当分数可以安全渡过中间的负数时可以选择渡过负数到另一个刷分区刷分,也可以留在本来的区域继续刷分,得到这些之后我们便可以考虑如何求出刷分区了,我们不难想出以点i为结尾的刷分区肯定是i的最大后缀和,得到以上结论后我们就可以dp了,当然这个题也可以建图跑最短路,代码挺容易理解了,具体实现看代码吧。

代码

dp

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define sp cout<<"---------------------------------------------------"<<endl;
#define li long long
li num[],vl[],pre[],a[];
class RowGame{
public:
li score(vector<int>board,int k){
int i,j,n=board.size();
pre[]=board[];
for(i=;i<n;i++)
pre[i]=(li)board[i]+pre[i-];
for(i=;i<n;i++)
if(pre[i]>=){
num[i]=k-;
vl[i]=pre[i];
}
a[]=board[];
for(i=;i<n;i++){
a[i]=board[i];
if(a[i-]>)
a[i]+=a[i-];
}
li ans=;
for(i=;i<n;i++)
if(num[i]&&a[i]>){
ans=max(ans,vl[i]+num[i]*a[i]);
li v=a[i]*;
for(j=i+;j<n;j++){
li x=num[i]-,y=vl[i]+v+pre[j]-pre[i];
if(y<){
li t=(-y-)/v+;
x-=t*;
y+=t*v;
}
if(x>num[j]||(x==num[j]&&y>vl[j])){
num[j]=x;
vl[j]=y;
}
}
}
return ans;
}
};

建图+最短路

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define sp cout<<"---------------------------------------------------"<<endl;
#define li long long
int n,n2;
li g[][],a[],step[],vl[];
const li inf=1e16+;
class RowGame{
public:
li score(vector<int>board,int k){
int i,j,n=board.size(),n2=n+n;
for(i=;i<n2;i++)
for(j=;j<n2;j++)
g[i][j]=-inf;
for(i=;i<n;i++){
li s=;
for(j=i;j<n;j++){
s+=board[j];
g[i][j+n]=g[j+n][i]=s;
}
}
for(i=;i<n2;i++){
a[i]=;
for(j=;j<n2;j++)
a[i]=max(a[i],g[i][j]+g[j][i]);
}
for(i=;i<n2;i++){
step[i]=inf;
vl[i]=-inf;
}
step[]=vl[]=;
for(int p=;p<n2;p++){
for(i=;i<n2;i++)
if(step[i]!=inf)
for(j=;j<n2;j++)
if(g[i][j]!=-inf){
li s=step[i],v=vl[i];
if(v+g[i][j]<){
if(a[i]<=)continue;
li ss=(-(v+g[i][j])-)/a[i]+;
s+=ss*;
v+=ss*a[i];
}
v+=g[i][j];
s++;
if(s<step[j]||(s==step[j]&&v>vl[j])){
step[j]=s;
vl[j]=v;
}
}
}
li res=;
for(i=;i<n2;i++)
if(step[i]<=k){
res=max(res,vl[i]);
res=max(res,vl[i]+(k-step[i])/*a[i]);
if(step[i]!=k)
for(j=;j<n2;j++)
if(g[i][j]!=-inf)
res=max(res,vl[i]+(k-step[i]-)/*a[i]+g[i][j]);
}
return res;
}
};

RowGame TopCoder - 10664的更多相关文章

  1. TopCoder kawigiEdit插件配置

    kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...

  2. 记第一次TopCoder, 练习SRM 583 div2 250

    今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...

  3. TopCoder比赛总结表

    TopCoder                        250                              500                                 ...

  4. Topcoder几例C++字符串应用

    本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...

  5. TopCoder

    在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...

  6. TopCoder SRM 596 DIV 1 250

    body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...

  7. 求拓扑排序的数量,例题 topcoder srm 654 div2 500

    周赛时遇到的一道比较有意思的题目: Problem Statement      There are N rooms in Maki's new house. The rooms are number ...

  8. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  9. Topcoder Arena插件配置和训练指南

    一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...

随机推荐

  1. 5.MySQL优化---索引优化专题

    来自互联网,整理转载. 摘要:多关于索引,分为以下几点来讲解: 一.索引的概述(什么是索引,索引的优缺点) 二.索引的基本使用(创建索引) 三.索引的基本原理(面试重点) 四.索引的数据结构(B树,h ...

  2. C语言的inline

    一.inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionName(Var1,Var2) (( ...

  3. BZOJ3302: [Shoi2005]树的双中心

    BZOJ3302: [Shoi2005]树的双中心 https://lydsy.com/JudgeOnline/problem.php?id=3302 分析: 朴素算法 : 枚举边,然后在两个连通块内 ...

  4. bae3.0第二步 添加一个空的django项目

    1.创建django项目: 进入bae应用源码目录(appidd01iud80bg)执行django-admin.py startproject blog2.修改index.py的内容如下所示 #-* ...

  5. HDOJ1010 (DFS+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  6. Dubbo各种协议详解

    (1)协议支持 Dubbo支持多种协议,如下所示: Dubbo协议 Hessian协议 HTTP协议 RMI协议 WebService协议 Thrift协议 Memcached协议 Redis协议 在 ...

  7. leetcode Single Number II - 位运算处理数组中的数

    题目描述: 给定一个包含n个整数的数组,除了一个数出现一次外所有的整数均出现三次,找出这个只出现一次的整数. 题目来源: http://oj.leetcode.com/problems/single- ...

  8. IDA Pro权威指南学习笔记(一)

    一直不懂逆向,最近刚好不忙,于是学习逆向,用来做笔记,顺便和大家分享交流. 参考书籍<IAD PRO权威指南> 工具: PETools: ETools 是另一款很好的PE文件编辑工具,以前 ...

  9. spring Annotation

    使用注解替代xml 在前几章的笔记基础上添加使用注解的形式 1.配置applicationContext 添加context schema <?xml version="1.0&quo ...

  10. 简单的触发黑名单阻断演示 control+c

    #include "stdafx.h"#include <signal.h>#include <windows.h> #include <iostre ...