CF 1278C Berry Jam 题解
Forewords
说实话我是被图吸引进来的23333,图画的真的挺好看。
题意
你从一个梯子下到地下室,梯子左右两边各有 \(n\) 瓶果酱排成一排,果酱口味为草莓味或蓝莓味,你每次只能吃你左边或右边没吃过的那瓶,求最少要吃多少瓶才能使两种口味的果酱数量相等。
题解
以样例为例,有 \(7\) 罐草莓味的和 \(5\) 罐蓝莓味的。

然后一直往右边吃,吃到这个时候,吃掉了 \(3\) 草蓝莓味的和 \(2\) 罐蓝莓味的,剩下 \(r_\text{left}=4\) 罐草莓味的和 \(b_\text{left}=3\) 罐蓝莓味的。

这时候,为了达到目的,可以再吃 \(r\) 罐草莓味的和 \(b\) 罐蓝莓味的,可行方案如下表:
| \(r\) | \(b\) |
|---|---|
| \(1\) | \(0\) |
| \(2\) | \(1\) |
| \(3\) | \(2\) |
| \(\dots\) | \(\dots\) |
可以发现,\(r-b\) 保持不变,且等于 \(r_\text{left}-b_\text{left}\)。
这一结论很显然,因为 \(r\) 和 \(b\) 只能减,不能增,因此达到目标的最好方法就是把数量多的口味吃到和另一个口味数量相等。然而这个方案并不一定能够达到,因此在这个的基础上再两种口味同时多吃 \(v\) 瓶。
具体实现就是预处理单吃一侧不同数量时产生的差值,然后枚举吃另一侧 \(1\dots n\) 瓶时要在另一侧吃的差值对应去找即可。
注意处理一下边界。
Code
这里因为带了个 map 所以复杂度是 \(O(n\log n)\),但是 map 可以优化成数组,降到 \(O(n)\)(比官方给的题解少一个 \(\log\))。
运用了一些小技巧来对调两边(其实可能不需要)。
#include<cstdio>
#include<map>
const int MAXN=1e5+5;
int a[MAXN],b[MAXN],t,bflag[MAXN],n,gtotr,gtotb,ans;
std::map<int,int>map;
int main()
{
scanf("%d",&t);
t*=2;
int cur=0;
for(;t>=1;t--)
{
map.clear();gtotr=gtotb=0;
if((++cur)%2)
{
ans=2147483647;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
}
else
{
for(int i=1;i<=n;i++)
std::swap(a[i],b[n-i+1]);
/*
for(int i=1;i<=n;i++)
printf("%d ",a[i]);
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
printf("\n");
*/
}
for(int i=1;i<=n;i++)
{
if(a[i]==1) gtotr++; else gtotb++;
}
int totr=0,totb=0;
map[0]=-1;
for(int i=1;i<=n;i++)
{
if(b[i]==1) totr++; else totb++;
bflag[i]=totr-totb;
if(!map[bflag[i]]) map[bflag[i]]=i;
// printf("%d %d\n",bflag[i],i);
}
gtotr+=totr;gtotb+=totb;
if(gtotr==gtotb) {if(!(cur%2))printf("0\n");continue;}
totr=totb=0;
for(int i=n;i>=1;i--)
{
if(a[i]==1) totr++; else totb++;
int result=map[(gtotr-totr)-(gtotb-totb)];
// printf("Eat [%d %d], Left[%d %d], Result %d\n",totr,totb,gtotr-totr,gtotb-totb,(gtotr-totr)-(gtotb-totb));
if(result) {if(result<0) result=0;ans=std::min(ans,n-i+1+result);}
}
if(!(cur%2)) printf("%d\n",ans);
}
return 0;
}
CF 1278C Berry Jam 题解的更多相关文章
- 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 ...
- codeforcesC - Berry Jam(折半枚举+1-1序列前后缀和)
Educational Codeforces Round 78 (Rated for Div. 2) C - Berry Jam C. Berry Jam time limit per test 2 ...
- CF Round #580(div2)题解报告
CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...
- Berry Jam codeforces 1278C
题目大意: 有两种类型的果酱,一个梯子,从中间开始吃,可以吃左边的,也可以吃右边的,最终要使两种类型的果酱的数量想等 题解: 思路对了,但是没考虑完. 对梯子的左侧的果酱I我们用两个数组记录其从1到i ...
- Berry Jam (前缀和)cf教育场
距离上一篇博客又2个月了 寻思着该除除草了 教育场是真的好难 可能是因为我还是只菜鸡 哭唧唧 先说下题意:有2*n罐果酱,草莓和蓝莓,梯子在中间从梯子那开始往两边吃(可以一会左一会右),问最少吃多少果 ...
- CF 1400F x-prime Substrings 题解【AC自动机+DP】
CF 1400F.x-prime Substrings 题意: 给定一个由\('1'\)到\('9'\)组成的字符串\(s\)和一个数\(x\),定义一个串为\(x-prime\)串,当且仅当这个串上 ...
- 「CF#554 div2」题解
A 水题一道. 题目的大致意思就是:给你两个集合,求集合间有多少数对和是奇数. 题解,开\(4\)个桶后,求一个\(min\)就可以了. #include <bits/stdc++.h> ...
- [题解向] CF#Global Round 1の题解(A $\to$ G)
这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...
- CF Global Round 21 题解 (CDEG)
C 把 \(a,b\) 全拆开然后比较即可(因为分裂和合并是互逆的) 注意开 long long . using namespace std; typedef long long ll; typede ...
随机推荐
- Jmeter_请求原件之参数化CSV
1.用途:注册10个账户 2.用CSV 制造数据相对比TEXT更方便 3.创建CSV 文件,注册账户和密码如下 4.Jmeter设置如下 因为是注册10个账户,要运行10次 5.线程组->添加- ...
- mysql练习(增删改查)char、int使用
(4)char的存储方式是,对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节:而varchar的存储方式是,对每个英文字符占用2个字节,汉字也占用2个字节,两者的存储数据都非unicode ...
- Sudo临时提权配置
目录 Sudo临时提权配置 参考 Sudo简介 Sudo配置文件 Sudo配置语法 Sudo配置实例 Sudo日志记录 Sudo临时提权配置
- 忘记SYS密码
进入控制台录入 sqlplus /nolog; connect / as sysdba alter user sys identified by ; alter user system ident ...
- XMPPFramework 框架
https://blog.csdn.net/qq_29846663/article/details/70170646 2017-04-14 11:37:02 于海明 阅读数 478更多 分类专栏: i ...
- day 12 zuoye
复习 # 函数 -- 2天 # 函数的定义和调用 # def 函数名(形参): #函数体 #return 返回值 #调用 函数名(实参) # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱 ...
- 【原】Mysql最大连接数
MySQL最大连接数的默认值是100, 这个数值对于并发连接很多的数据库的应用是远不够用的,当连接请求大于默认连接数后,就会出现无法连接数据库的错误,因此我们需要把它适当调大一些. 在使用MySQL数 ...
- base64相关
1.base64指定的64个字符(包含52个大小写.10个数字和+./): abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ...
- Python读取MNIST数据集
MNIST数据集获取 MNIST数据集是入门机器学习/模式识别的最经典数据集之一.最早于1998年Yan Lecun在论文: Gradient-based learning applied to do ...
- STM32F4/F7运算性能
参考http://bbs.21ic.com/icview-1622796-1-1.html