Codeforces Round #127 (Div. 1) C. Fragile Bridges dp
C. Fragile Bridges
题目连接:
http://codeforces.com/contest/201/problem/C
Description
You are playing a video game and you have just reached the bonus level, where the only possible goal is to score as many points as possible. Being a perfectionist, you've decided that you won't leave this level until you've gained the maximum possible number of points there.
The bonus level consists of n small platforms placed in a line and numbered from 1 to n from left to right and (n - 1) bridges connecting adjacent platforms. The bridges between the platforms are very fragile, and for each bridge the number of times one can pass this bridge from one of its ends to the other before it collapses forever is known in advance.
The player's actions are as follows. First, he selects one of the platforms to be the starting position for his hero. After that the player can freely move the hero across the platforms moving by the undestroyed bridges. As soon as the hero finds himself on a platform with no undestroyed bridge attached to it, the level is automatically ended. The number of points scored by the player at the end of the level is calculated as the number of transitions made by the hero between the platforms. Note that if the hero started moving by a certain bridge, he has to continue moving in the same direction until he is on a platform.
Find how many points you need to score to be sure that nobody will beat your record, and move to the next level with a quiet heart.
Input
The first line contains a single integer n (2 ≤ n ≤ 105) — the number of platforms on the bonus level. The second line contains (n - 1) integers ai (1 ≤ ai ≤ 109, 1 ≤ i < n) — the number of transitions from one end to the other that the bridge between platforms i and i + 1 can bear.
Output
Print a single integer — the maximum number of points a player can get on the bonus level.
Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.
Sample Input
5
2 1 2 1
Sample Output
5
Hint
题意
有n个点,n-1座桥,每座桥最多通过a[i]次,每通过一次可以获得1分
然后问你怎么选择起点和路线,才能获得最多的分数
题解:
dp
我们想想可以发现,我们令l[i]表示i点向左边走,且最后回到i点最多能得多少分,r[i]表示i点向右走,且最后回到i点最多能得多少分
odd[i]表示,从1号桥开始,走到i号桥,最多能得多少分
显然,我们这道题要求的最大值,应该就是l[i]-odd[i]+r[j]+odd[j]这个东西,使得这个东西最大就好了
我们暴力枚举j,然后每次用set去拿到最大的l[i]-odd[i]就好了
应该叫dp吧,大概 O.O
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
long long l[maxn],r[maxn],odd[maxn];
int n;
long long a[maxn];
int get(int x)
{
if(x%2==1)return x-1;
return x;
}
set<long long>s;
int main()
{
scanf("%d",&n);
for(int i=0;i<n-1;i++)
scanf("%d",&a[i]);
for(int i=1;i<n-1;i++)
if(a[i-1]>1)
l[i]=l[i-1]+get(a[i-1]);
for(int i=n-2;i>=0;i--)
if(a[i]>1)
r[i]=r[i+1]+get(a[i]);
for(int i=0;i<n-1;i++)
{
odd[i]+=get(a[i]-1)+1;
if(i>0)odd[i]+=odd[i-1];
}
long long ans = l[0]+r[0];
long long tmp = ans;
s.insert(l[0]);
for(int i=1;i<n;i++)
{
s.insert(l[i]-odd[i-1]);
long long p=*--s.lower_bound(1LL*1e16);
ans=max(r[i]+odd[i-1]+p,ans);
}
cout<<ans<<endl;
}
Codeforces Round #127 (Div. 1) C. Fragile Bridges dp的更多相关文章
- Codeforces Round #127 (Div. 2)
A. LLPS 长度最大10,暴力枚举即可. B. Brand New Easy Problem 枚举\(n\)的全排列,按题意求最小的\(x\),即逆序对个数. C. Clear Symmetry ...
- Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
题目链接:http://codeforces.com/contest/283/problem/B 思路: dp[now][flag]表示现在在位置now,flag表示是接下来要做的步骤,然后根据题意记 ...
- Codeforces Round #127 (Div. 1) E. Thoroughly Bureaucratic Organization 二分 数学
E. Thoroughly Bureaucratic Organization 题目连接: http://www.codeforces.com/contest/201/problem/E Descri ...
- Codeforces Round #127 (Div. 1) D. Brand New Problem 暴力dp
D. Brand New Problem 题目连接: http://www.codeforces.com/contest/201/problem/D Description A widely know ...
- Codeforces Round #127 (Div. 1) B. Guess That Car! 扫描线
B. Guess That Car! 题目连接: http://codeforces.com/contest/201/problem/B Description A widely known amon ...
- Codeforces Round #127 (Div. 1) A. Clear Symmetry 打表
A. Clear Symmetry 题目连接: http://codeforces.com/contest/201/problem/A Description Consider some square ...
- Codeforces Round #131 (Div. 2) E. Relay Race dp
题目链接: http://codeforces.com/problemset/problem/214/E Relay Race time limit per test4 secondsmemory l ...
- Codeforces Round #338 (Div. 2) C. Running Track dp
C. Running Track 题目连接: http://www.codeforces.com/contest/615/problem/C Description A boy named Ayrat ...
- Codeforces Round #338 (Div. 2) B. Longtail Hedgehog dp
B. Longtail Hedgehog 题目连接: http://www.codeforces.com/contest/615/problem/B Description This Christma ...
随机推荐
- Linux内核的架构
GNU/Linux操作系统架构 备注:IPC进程间通.IPC(Inter-Process Communication)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道 ...
- Laravel 5.2 一、安装与目录结构
一.Laravel 安装 这里选择通过 Composer 的 create-project 命令来安装 Laravel 应用. composer create-project laravel/lara ...
- ktime使用例子【原创】
#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include ...
- SVN服务的配置与管理
引言 没当服务器重启,SVN服务都会停止,每次都得重启一下服务,为了解决这样的问题.有了下文. 一.配置自启动服务 sc create SVNService binpath="E:\svn\ ...
- centos7.4通过yum安装mysql
安装环境:CentOS7 64位 MINI版,安装MySQL5.7 1.配置YUM源 在MySQL官网中下载YUM源rpm安装包:http://dev.mysql.com/downloads/repo ...
- VMware Workstation虚拟机Ubuntu中实现与主机共享(复制和粘贴)
VMware Workstation中安装虚拟机Ubuntu后,开始都不能与主机实现共享,即相互之间能实现复制粘贴的功能.要解决问题,只需要安装VMvare tools后然后重启虚拟机Ubuntu即可 ...
- P2725 邮票 Stamps(完全背包+限制填充数)
题目链接:https://www.luogu.org/problem/show?pid=2725 题目大意:给一组 N 枚邮票的面值集合(如,{1 分,3 分})和一个上限 K —— 表示信封上能够贴 ...
- 196. Delete Duplicate Emails
Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...
- AC日记——送花 洛谷 P2073
送花 思路: 线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 struct TreeN ...
- 查找文件which locate find
(1)which:查找命令文件路径 which ls //命令的路径查找是根据PATH环境变量 whereis ls echo $PATH //打印PATH环境变量 (2)locate:查找任意文件 ...