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 ...
随机推荐
- 是因为Session只能让服务器在一次连续的会话中记住你,而Cookie是记住浏览器一段时间
Cookie的作用 因为http协议先天不足是无记忆性. 还有一个区别是:Session是服务器端保存会话状态的机制. 而Cookie则是浏览器端保存会话的机制. Cookie 的应用
- uva1315 Crazy tea party(找规律)
题意就是说把顺时针排的1到n换成逆时针排的需要的最少交换步数. 如果是线形的一串数,需要的交换次数就是个冒泡排序的交换次数:n*(n-1)/2,或者用a[i]=(i-1)+a[i-1]推出来. 对于环 ...
- UVALive 3708 Graveyard(思维题)
将原有的每个雕塑的坐标位置,映射在一个总长为n+m的数轴上,设第一个点的坐标为0,(新的等分点必然有至少有一个和原来n等分的等分点重合,因为等分点可以等距的绕圆周旋转,总可以转到有至少一个重合的,不妨 ...
- leetcode_sql_1,176,177
1.176题目,Second Highest Salary,https://leetcode.com/problems/second-highest-salary/#/description Writ ...
- (C#)Windows Shell 外壳编程系列5 - 获取图标
(本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:(C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 有 ...
- mysql的备份恢复等操作
备份数据库 shell> mysqldump -h host -u root -p dbname >dbname_backup.sql 恢复数据库 shell> mysqladmin ...
- debug的时候出现停在ThreadPoolexecutor.class文件中停留的解决办法
原因: The posted stack trace indicates that a RuntimeException was encountered in a Daemon thread. Thi ...
- java代码用continue输出奇数——————————
总结:continue用法是:在for,do-while.while循环中 并且,continue的意思是跳出循环的剩余部分,进行下一次循环.不是下一步循环 package com.b; import ...
- MySQL 常用启动,关闭,登录脚本
MySQL 常用启动,关闭,登录脚本 规范化mysql的启动,关闭,登录 1 cat mysql_env.ini #set env MYSQL_USER=system #注意用户权限 MYSQL_PA ...
- phonegap制作windows phone包
下载SDK win7及以下版本下载SDK http://www.microsoft.com/zh-cn/download/confirmation.aspx?id=27570 WIN8下载SDK ht ...