传送门

分析

首先不难想到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. 【暂时解决】win10下安装VS2017 15.3版本 提示 未能安装包“Microsoft.NET.4.6.FullRedist.NonThreshold.Resources,version=4.6.81.9,language=zh-CN”。

    win10下安装VS2017 15.3版本的时候,出现以上错误日志提示,请问如何解决的哇? 这个问题,开始我以为是我的安装包所在的路径问题引起的,但是我将安装包移动到了磁盘根目录进行安装,依然出现这个 ...

  2. 2018.8.10 programming bat based on python

    @echo off REM Current DevProg Version. Match the pip package version (x.y.z)SET currentversion=0.4.0 ...

  3. svn代码回滚命令 svn up -r

    第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [-R] something 其中so ...

  4. HihoCoder1449 重复旋律6(后缀自动机)

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中所有长度为K的旋律中出现次数最多的旋律的出现次数.但是K不是固定的,小Hi想知道对 ...

  5. Linux命令学习(22):ss命令

    版权声明 更新:2017-05-20 博主:LuckyAlan 联系:liuwenvip163@163.com 声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的ss命令 ...

  6. Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129

    大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(st ...

  7. [BZOJ1797][AHOI2009]最小割Mincut

    bzoj luogu sol 一条边出现在最小割集中的必要条件和充分条件. 先跑出任意一个最小割,然后在残余网络上跑出\(scc\). 一条边\((u,v)\)在最小割集中的必要条件:\(bel[u] ...

  8. js整数千分化

    function numToQfh(num){ var num_str = num.toString(); var strTo = " "; while(num_str.lengt ...

  9. TexStudio 非常好用的Latex软件

    先大概写一下,免得忘了,等有时间详细补充. 跨平台.免费. 语法高亮 方便的公式.符号选择界面 可以配置Latex,pdflatex,xelatex等默认编译命令 集成了pdf阅读器,可在阅读器中浏览 ...

  10. IE版本的标准定义

    解决方案 首页加代码把IE浏览器的标准改了,无论客户用的什么IE,都是按照IE7的标准来的. <meta http-equiv="X-UA-Compatible" conte ...