Score:600600600 points

题面

传送门
翻译有时间再补…

题解

体验感极差,考试的时候手残把1打成了2Debug了半个小时,害的F题都没做。
先将题目转换一下:给你一条链,顺次连接着n+1n+1n+1个点,每条边有一个边权AiA_iAi​,在有一个人从任意一个起点PPP出发,设他经过第iii条边的次数DiD_iDi​,求∑i=1n∣Ai+Di∣\sum^{n}_{i=1}|A_i+D_i|∑i=1n​∣Ai​+Di​∣的最小值。
首先需要证明一个结论:
A_i为奇数,等价于Ai=1A_i=1Ai​=1。
A_i为大于0的偶数,等价于Ai=2A_i=2Ai​=2。
证明很简单,可以发现走到边的同一侧的DiD_iDi​奇偶性相同,由于你经过这条边的时候可以任意来回跳动偶数次,那么答案一定不会变的更劣。
考虑一个人从PPP点出发,有两种方案:
1.先往左边走,然后回到PPP点,再往右边走,不再回来。
2.先往右边走,然后回到PPP点,再往左边走,不再回来。
这很像一个dp。
定义状态L1i,L2i,R1i,R2iL1_i,L2_i,R1_i,R2_iL1i​,L2i​,R1i​,R2i​
分别代表从iii点向左走需要回来的最小代价,从iii点向左走不需要回来的最小代价,从iii点向右走需要回来的最小代价,从iii点向右走不需要回来的最小代价。

L1[i]={min⁡(L1i−1+2,lsumi)(Ai==0)min⁡(L1i−1+1,lsumi)(Ai==1)min⁡(L1i−1,lsumi)(Ai==2) L1[i]=\begin{cases} \min(L1_{i-1}+2,lsum_i)(A_i==0)\\ \min(L1_{i-1}+1,lsum_i)(A_i==1)\\ \min(L1_{i-1},lsum_i)(A_i==2)\\ \end{cases} L1[i]=⎩⎪⎨⎪⎧​min(L1i−1​+2,lsumi​)(Ai​==0)min(L1i−1​+1,lsumi​)(Ai​==1)min(L1i−1​,lsumi​)(Ai​==2)​
L2[i]={min⁡(L1i,min(L2i−1+1,lsumi))(Ai==0)min⁡(L1i,min(L2i−1,lsumi))(Ai==1)min⁡(L1i,min(L2i−1+1,lsumi))(Ai==2) L2[i]=\begin{cases}\min(L1_i,min(L2_{i-1}+1,lsum_i))(A_i==0)\\ \min(L1_i,min(L2_{i-1},lsum_i))(A_i==1)\\ \min(L1_i,min(L2_{i-1}+1,lsum_i))(A_i==2)\\ \end{cases} L2[i]=⎩⎪⎨⎪⎧​min(L1i​,min(L2i−1​+1,lsumi​))(Ai​==0)min(L1i​,min(L2i−1​,lsumi​))(Ai​==1)min(L1i​,min(L2i−1​+1,lsumi​))(Ai​==2)​
R同理。
需要注意的是在走路的过程中可以随时不走后面的路调头,代价是前面/后面iii个数的AiA_iAi​之和。
答案就是min(L1[i]+R2[i],L2[i]+R1[i])min(L1[i]+R2[i],L2[i]+R1[i])min(L1[i]+R2[i],L2[i]+R1[i])。
时间复杂度:O(n)O(n)O(n)
[题解好像还有一种神仙写法,我菜爆了…]

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define MAXN 200000
#define LL long long
#define DB double
#define FR first
#define SE second
int a[MAXN+5];
LL ans;
LL L1[MAXN],L2[MAXN+5],R1[MAXN+5],R2[MAXN+5];
LL lsum[MAXN+5],rsum[MAXN+5];
int n;
int get_num(int p)
{if(p==0)return 0;if(p%2==1)return 1;return 2;
}
int main()
{ans=1000000000;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)lsum[i]=lsum[i-1]+a[i];for(int i=n-1;i>=0;i--)rsum[i]=rsum[i+1]+a[i+1];for(int i=1;i<=n;i++)a[i]=get_num(a[i]);for(int i=1;i<=n;i++){if(a[i]==0)L1[i]=min(L1[i-1]+2,lsum[i]);else if(a[i]==1)L1[i]=min(L1[i-1]+1,lsum[i]);else L1[i]=min(L1[i-1],lsum[i]);if(a[i]==0)L2[i]=min(L1[i],min(L2[i-1]+1,lsum[i]));else if(a[i]==1)L2[i]=min(L1[i],min(L2[i-1],lsum[i]));else L2[i]=min(L1[i],min(L2[i-1]+1,lsum[i]));}for(int i=n-1;i>=0;i--){if(a[i+1]==0)R1[i]=min(R1[i+1]+2,rsum[i]);else if(a[i+1]==1)R1[i]=min(R1[i+1]+1,rsum[i]);else R1[i]=min(R1[i+1],rsum[i]);if(a[i+1]==0)R2[i]=min(R1[i],min(R2[i+1]+1,rsum[i]));else if(a[i+1]==1)R2[i]=min(R1[i],min(R2[i+1],rsum[i]));else R2[i]=min(R1[i],min(R2[i+1]+1,rsum[i]));}for(int i=0;i<=n;i++){//printf("%d %lld %lld\n",i,L1[i]+R2[i],L2[i]+R1[i]);ans=min(ans,min(L1[i]+R2[i],L2[i]+R1[i]));}printf("%lld\n",ans);
}

转载于:https://www.cnblogs.com/Panda-hu/p/11145746.html

[Atcoder Yahoo Contest 2019]D.Ears(动态规划)相关推荐

  1. Yahoo Programming Contest 2019 D - Ears

    D - Ears 思路: s:起点           t:终点           l:左端点           r:右端点 以上称为关键点 dp[i][j]表示到位置 i 为止,已经经过前 j ...

  2. Yahoo Programming Contest 2019.D.Ears(DP)

    题目链接 菜爆了啊QAQ 记起点为\(S\),终点为\(T\),走过的最靠左的点是\(L\),最靠右的点是\(R\). 那么坐标轴被分成了五段: \(0\sim L-1\):经过\(0\)次: \(L ...

  3. AtCoder题解 —— AtCoder Grand Contest 050 —— B - Three Coins —— 动态规划

    题目相关 题目链接 AtCoder Grand Contest 050 B 题,https://atcoder.jp/contests/agc050/tasks/agc050_b. Problem S ...

  4. 【每日亿题#12】AtCoder Grand Contest 021 (A ~ F)全部题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 AtCoder Grand Contest 021 题解 A. Digit Sum 2 B. ...

  5. AtCoder Beginner Contest 245

    AtCoder Beginner Contest 245 文章目录 AtCoder Beginner Contest 245 A - Good morning B - Mex C - Choose E ...

  6. AtCoder Beginner Contest 202 D - aab aba baa(组合计数,字典序)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 有 AAA 和 aaa,BBB 个 bbb ,可以使用这 A+BA+BA+B 个字符任 ...

  7. AtCoder Beginner Contest 197 题解(A ~ F)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Rotate B - Visibility C - ORXOR D - Opposite ...

  8. AtCoder Beginner Contest 198 (A ~ F)题解

    目录 A. Div B. Palindrome with leading zeros C. Compass Walking D. Send More Money E. Unique Color F. ...

  9. AtCoder Beginner Contest 215 G - Colorful Candies 2

    AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...

最新文章

  1. sudo运行程序遇到的问题
  2. img标签的onerror事件来显示默认图片
  3. 使用python调用matlab方法
  4. 干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)
  5. python网络编程需要学什么,python网络编程学习笔记(五):socket的一些补充 Python 网络编程需要学习哪些网络相关的知识...
  6. bzoj2843极地旅行社题解
  7. 基于情感词典的情感值分析
  8. Unity3D基础37:Input控制面板
  9. java调用scala内部类_scala中的内部类 == 简单示例
  10. 翻新电子元器件识别的一些方法技巧
  11. 项目中用到的ws2811炫彩灯控制程序
  12. BackTrack 3下使用spoonwep2破解WEP加密的无线路由器
  13. KVASER 与 Matlab联合使用
  14. ROS(ROUTEROS) 端口映射
  15. 新浪微博热门话题 (30 分)
  16. Android接入微信SDK如何处理WXEntryActivity
  17. 网易-资深iOS开发工程师
  18. 测试职业规划之知识点总结
  19. Qt Creator 注释乱码
  20. 详细了解步进电机的最大静转矩以及矩频特性

热门文章

  1. 一文带你读懂,这三个交换机层级的区别和联系。
  2. 05.OpenWrt-写入mac地址
  3. 多多情报通:拼多多店铺不交保证金能卖货吗?有什么影响吗?
  4. 稠密集和疏朗集_稠密集与疏朗集.pdf
  5. 网络编程四-原生JDK的NIO及其应用
  6. 赵匡胤为何不把皇位传给儿子却传弟弟赵光义
  7. java-php-python-ssm计算机网络精品课程网站计算机毕业设计
  8. 春气融和,再创佳绩 | 菊风中标华融湘江银行远程视频银行项目
  9. 大数据java篇——集合类
  10. 最短路算法 :Bellman-ford算法 Dijkstra算法 floyd算法 SPFA算法 详解