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 ...
随机推荐
- Scrapy模拟登陆
1. 为什么需要模拟登陆? #获取cookie,能够爬取登陆后的页面 2. 回顾: requests是如何模拟登陆的? #1.直接携带cookies请求页面 #2.找接口发送post请求存储cooki ...
- IDEA自动部署WEB工程至远程服务器(学习笔记)
一.部署Web工程的几种方式 ①本地打war,上传至远程服务器tomcat容器即可 优点:简单粗暴 缺点:浪费时间 ②IDEA自动部署至远程服务器 优点:节省大量时间 缺点:配置稍多(第一次) 二.I ...
- 使用axios对安卓或者ios低版本兼容性处理
原因:不支持ES6,无法使用promise 解决办法: 1.安装 es6-promise cnpm install es6-promise --save-dev 2.引入 es6-promise im ...
- C语言:将带头节点的单向链表结点域中的数据从小到大排序。-求出单向链表结点(不包括头节点)数据域中的最大值。-将M*N的二维数组中的数据,按行依次放入一维数组,
//函数fun功能是将带头节点的单向链表结点域中的数据从小到大排序. //相当于数组的冒泡排序. #include <stdio.h> #include <stdlib.h> ...
- 计算机二级-C语言-字符数字转化为整型数字。形参与实参类型相一致。double类型的使用。
//函数fun功能:将a和b所指的两个字符串分别转化成面值相同的整数,并进行相加作为函数值返回,规定只含有9个以下数字字符. //重难点:字符数字转化为整型数字. #include <stdio ...
- DELPHI开发和使用REDIS
DELPHI开发和使用REDIS REDIS SERVER是独立的存在,支持WINDOWS,LINUXREDIS PUB/SUB 用于聊天 只是其中的一种用法任何消息或其他类型数据 都可以必须安装 ...
- web渗透(转)
某天比较无聊,听一个朋友推荐httpscan这款工具,于是就下载下来试试. 首先对某学校网段开始进行测试. 1 python httpscan.py **.**.**.0/24 测试时发现有个比较 ...
- idea 启动java项目报 java: 程序包org.apache.jasper.tagplugins.jstl.core不存在
File -- Project Structure
- js中数组的循环与遍历forEach,map
对于前端的循环遍历我们知道有 针对js数组的forEach().map().filter().reduce()方法 针对js对象的for/in语句(for/in也能遍历数组,但不推荐) 针对jq数组/ ...
- ANSYS单元应用简介1
目录 1. LINK单元 2. BEAM单元 3. PLANE单元 4. SHELL单元 5. SOLIDE单元 6. COMBIN单元 ANSYS中的单元针对不同的应用对象,有着不同的选择方法,下面 ...