RowGame TopCoder - 10664
分析
首先不难想到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的更多相关文章
- TopCoder kawigiEdit插件配置
kawigiEdit插件可以提高 TopCoder编译,提交效率,可以管理保存每次SRM的代码. kawigiEdit下载地址:http://code.google.com/p/kawigiedit/ ...
- 记第一次TopCoder, 练习SRM 583 div2 250
今天第一次做topcoder,没有比赛,所以找的最新一期的SRM练习,做了第一道题. 题目大意是说 给一个数字字符串,任意交换两位,使数字变为最小,不能有前导0. 看到题目以后,先想到的找规律,发现要 ...
- TopCoder比赛总结表
TopCoder 250 500 ...
- Topcoder几例C++字符串应用
本文写于9月初,是利用Topcoder准备应聘时的机试环节临时补习的C++的一部分内容.签约之后,没有再进行练习,此文暂告一段落. 换句话说,就是本文太监了,一直做草稿看着别扭,删掉又觉得可惜,索性发 ...
- TopCoder
在TopCoder下载好luncher,网址:https://www.topcoder.com/community/competitive%20programming/ 选择launch web ar ...
- TopCoder SRM 596 DIV 1 250
body { font-family: Monospaced; font-size: 12pt } pre { font-family: Monospaced; font-size: 12pt } P ...
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- TopCoder SRM 590
第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement Fox Ciel is going to play Gomoku with her friend ...
- Topcoder Arena插件配置和训练指南
一. Arena插件配置 1. 下载Arena 指针:http://community.topcoder.com/tc?module=MyHome 左边Competitions->Algorit ...
随机推荐
- New Concept English three (53)
30w/m 56errors The Scandinavian countries are much admired all over the world for their enlightened ...
- Python中类的约束
如何在python中进行类的约束 使某些类必须有一些方法 1 python 的抽象类实现 === 约束性不高 Python是 解释性语言 from abc import ABCMeta from ab ...
- 1.mysql优化---优化入门之MySQL的优化介绍及执行步骤
优化到底优化什么? 优化,一直是面试最常问的一个问题.因为从优化的角度,优化的思路,完全可以看出一个人的技术积累.那么,关于系统优化,假设这么个场景,用户反映系统太卡(其实就是高并发),那么 ...
- Audiophobia(Floyd算法)
个人心得:这在一定途径上完成查询方面还是很吃力,得多锻炼空间能力,不能再每次都看到就后退,要全力应对, 那怕被虐的不要不要的. 这题主要是求俩个端点中所有路径中最大构成的集合中最小的数值,其实开始思想 ...
- Mayor's posters (线段树加离散化)
个人心得:线段树也有了一定的掌握,线段树对于区间问题的高效性还是挺好的,不过当区间过大时就需要离散化了,一直不了解离散化是什么鬼,后面去看了下 离散化,把无限空间中有限的个体映射到有限的空间中去,以此 ...
- 【转】探秘Java中的String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一 ...
- 开启MySQL的sql语句记录
在开发的时候经常会想看一下MySQL最终执行的sql或者想保存sql记录,所以我们可以启用MySQL的sql记录功能. 开启方法:Linux下编辑MySQL的my.cnf文件,windows下编辑my ...
- 使用 MLCC 替代电解电容需要注意几点 (2018-07-23)
使用 MLCC 替代电解电容需要注意几点 容量,MLCC 在高压时容量会降到标称的 30~50% 以下 1. MLCC 的 ESR 很低,比较适合高频 DCDC 输出. MLCC 会有压电效应,可能会 ...
- WebForm中创建树节点TreeNode
Tree: namespace ECTECH.NorthSJ.Web.SysData { public partial class testTree : BasePage { ; protected ...
- Python:序列的copy() 方法和 copy 模块
转于:Python中copy和deepcopy中的区别 博主:assan 一.序列中的 copy() 方法 # 此方法为浅度复制:复制的数会随着被复制数的嵌套序列的元素的改变而改变: # 功能:将一个 ...