https://vjudge.net/problem/CodeForces-1278C

题意:有2n瓶果酱,中间有一个楼梯隔开,从中间往左或右两边清空果酱,使得两种果酱的数量相等,最少要清空多少瓶

思路:第一眼看到并没有什么思路,想用果酱数量的前缀和,但不知道怎么运用,看到一篇博客,把数字2改为-1这几个字眼,恍然大悟。


例如第一组数据

原数据 1,1,1,2,2,         1,2,1,2,1,1,2

变为   1,1,1,-1,-1,1,   -1,1,-1,1,1,-1

前缀和 ,2,3,2,,2,     0,1,0,1,0,-1

因为清除果酱只能从中间的楼梯向两边扩展,所以左边的前缀和是→累加的,右边的前缀和是←累加的也叫后缀和吧。正负分别表示某种果酱多出的数量,相加相等则表示数量相等。如上的红色字体位置,二者之间的果酱都需要清除掉,共6瓶。为了使清除的果酱数量尽可能少,相同的前后缀和,左边前缀和尽量往右靠,右边后缀和尽量往左靠。

又如另一组数据

原数据 1,0,0,      1,0,0

变为   1,-1,-1,    1,-1,-1

前缀和 ,0,-1,    -1,-2,-1

显然去掉左边2瓶就是答案。

选择红色位置用aid数组和bid数组,这两个数组起到指示下标的作用。

第三组数据的应对方法详看代码。

第四种数组1,2,  1,1或者1,1,  2,1之类的,需要对0做出处理。在这个数据上wa很多次。详看代码。

import java.util.Arrays;
import java.util.Scanner; public class Main { public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int n,x; int t=scan.nextInt();
while(t!=0) {
int p=100000;
int [] a=new int[100005];//左边果酱前缀和 →
int [] b=new int[100005];//右边果酱后缀和 ←
int [] aid=new int[200005];
int [] bid=new int[200005];
//前缀和的数字下标,aid[2]=5表示a前缀数组内容为2的在前缀和数组下标为5的位置
t--;
n=scan.nextInt();
aid[p]=0;
for(int i=1;i<=n;i++) {//从左到右输入,直接计算前缀和
x=scan.nextInt();
if(x==1)
a[i]=a[i-1]+1;
else
a[i]=a[i-1]-1; int idx=a[i]+p;//防止遇到负数导致数组越界
aid[ idx ]=i;//前缀和尽量往右靠,i越来越大
} for(int i=1;i<=n;i++) {//从左到右输入
x=scan.nextInt();
if(x!=1)
x=-1;
b[i]=x;
}
bid[p]=n+1;
for(int i=n;i>=1;i--) {//从右往左计算后缀和
b[i]+=b[i+1]; int idx=b[i]+p;
bid[idx]=i;//后缀和尽量往左靠,i越来越小
} int ans=2*n;//最多把全部果酱拿走,应付第3组数据
for(int i=-n;i<=n;i++) {
if( (aid[p+i]!=0 && bid[p-i]!=0) || (i==0))
ans=Math.min(ans,n-aid[p+i]+bid[p-i]-1);
}
System.out.println(ans);
}
} }

CF1278C-Berry Jam-(前缀和)的更多相关文章

  1. codeforcesC - Berry Jam(折半枚举+1-1序列前后缀和)

    Educational Codeforces Round 78 (Rated for Div. 2) C - Berry Jam C. Berry Jam time limit per test 2 ...

  2. Educational Codeforces Round 78 (Rated for Div. 2) C. Berry Jam

    链接: https://codeforces.com/contest/1278/problem/C 题意: Karlsson has recently discovered a huge stock ...

  3. Berry Jam (前缀和)cf教育场

    距离上一篇博客又2个月了 寻思着该除除草了 教育场是真的好难 可能是因为我还是只菜鸡 哭唧唧 先说下题意:有2*n罐果酱,草莓和蓝莓,梯子在中间从梯子那开始往两边吃(可以一会左一会右),问最少吃多少果 ...

  4. Educational Codeforces Round 78 (Rated for Div. 2) C - Berry Jam(前缀和)

  5. CF 1278C Berry Jam 题解

    Forewords 说实话我是被图吸引进来的23333,图画的真的挺好看. 题意 你从一个梯子下到地下室,梯子左右两边各有 \(n\) 瓶果酱排成一排,果酱口味为草莓味或蓝莓味,你每次只能吃你左边或右 ...

  6. Berry Jam codeforces 1278C

    题目大意: 有两种类型的果酱,一个梯子,从中间开始吃,可以吃左边的,也可以吃右边的,最终要使两种类型的果酱的数量想等 题解: 思路对了,但是没考虑完. 对梯子的左侧的果酱I我们用两个数组记录其从1到i ...

  7. 2021record

    2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...

  8. Educational Codeforces Round 78 (Rated for Div. 2) 题解

    Shuffle Hashing A and B Berry Jam Segment Tree Tests for problem D Cards Shuffle Hashing \[ Time Lim ...

  9. 【cf比赛记录】Educational Codeforces Round 78 (Rated for Div. 2)

    比赛传送门 A. Shuffle Hashing 题意:加密字符串.可以把字符串的字母打乱后再从前面以及后面接上字符串.问加密后的字符串是否符合加密规则. 题解:字符串的长度很短,直接暴力搜索所有情况 ...

  10. HDU1671——前缀树的一点感触

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceed ...

随机推荐

  1. SSM框架(Spring + Spring MVC + Mybatis)搭建

    Spring是一个轻量级的框架,用到了注解和自动装配,就是IOC和AOP: SpringMVC是Spring实现的一个Web层,相当于Struts的框架: Mybatis是 一个持久层的框架,在使用上 ...

  2. [译]基于ASP.NET Core 3.0的ABP v0.21已发布

    基于ASP.NET Core 3.0的ABP v0.21已发布 在微软发布仅仅一个小时后, 基于ASP.NET Core 3.0的ABP v0.21也紧跟着发布了. v0.21没有新功能.它只是升级到 ...

  3. CSS旋转动画和动画的拼接

    旋转动画 第一个样式: @keyframes rotating { from { transform: rotate(0deg); } to { transform: rotate(360deg); ...

  4. 【Collect】免费图片库网站推荐(国外高清可商用)

    #国外高清可商用免费图片库 1.https://unsplash.com/2.https://pixabay.com/3.https://www.sitebuilderreport.com/stock ...

  5. UmiJS 目录及约定

    在文件和目录的组织上,umi 更倾向于选择约定的方式. 一个复杂应用的目录结构如下: . ├── dist/ // 默认的 build 输出目录 ├── mock/ // mock 文件所在目录,基于 ...

  6. IT兄弟连 HTML5教程 HTML5行业的发展预测

    现在的互联网市场上,HTML5在快速地成长,甚至是未来几年里将会有很多公司进入HTML5这个领域,HTML5也会像传统的Flex,Flash,Silverlight和Objective-C那样,更容易 ...

  7. IT兄弟连 Java语法教程 流程控制语句 经典案例

    使用continue忽略本次循环剩下的语句 continue的功能和break有点类似,区别是continue只是忽略本次循环剩下的语句,接着开始下一次循环,并不会终止循环:而break则是完全终止循 ...

  8. IT兄弟连 Java语法教程 位运算符

    Java定义了几个位运算符,它们都可以用于整数类型(long.int.short.byte以及char).这些运算符对操作数的单个位进行操作.表1 对位运算符进行了总结. 表1  位运算符 由于位运算 ...

  9. 邮件hMailServer +Foxmail 安装使用教程

    hMialServer是Windows下一款免费开源的邮件服务器软件,支持smtp.pop3.imap. 本文主要根据官方文档Quick-Start guide整理而成. 一.下载 下载地址:http ...

  10. Java技巧——比较两个日期相差的天数

    Java技巧——比较两个日期相差的天数 摘要:本文主要记录了在Java里面如何判断两个日期相差的天数. 判断两个Date类型的日期之间的天数 通过计算毫秒数判断: public static void ...