CodeForces - 1257E (思维)
题意
https://vjudge.net/problem/CodeForces-1257E
三个人,每个人有一些数字,组合起来是1~n,每个人可以给另一个人一个拥有的数字,问最小操作数,使得第一个人拥有1~i的数,第二个人拥有i+1~j的数,第三个人拥有j+1~n的数,即第一个人为前缀,第二个人为中间部分,第三个人为后缀。 注意:可以有一个或两个人最后不拥有数字。
思路
先把问题简单化,考虑只有两个人的情况。设cnt1[x]表示第一个人前x个数拥有的个数,cnt2[x]表示第二个人前x个数拥有的个数,如果第一个人获得的前缀为1~i,第二个人获得的后缀为i+1~n,那么代价为cnt2[i]+cnt1[n]-cnt1[i]。
再考虑三个人的情况,同样,如果第一个人获得1~i,第二个人获得i+1~j,第三个人获得j+1~n,那么代价为cnt2[i]+cnt3[i] +cnt1[j]-cnt1[i]+cnt3[j]-cnt3[i] + cnt1[n]-cnt1[j]+cnt2[n]-cnt2[j],化简得:cnt2[i]-cnt1[i]+cnt3[j]+cnt1[n]+cnt2[n]-cnt2[j],即cnt2[i]-cnt1[i] + cnt1[n]+cnt2[n] + cnt3[j]-cnt2[j],所以枚举i,使这个式子值最小,发现还剩下两个和j有关的项对式子有影响,而j>=i,于是问题转化成了枚举i,求cnt2[i]-cnt1[i]+min(cnt3[i~n]-cnt2[i~n])+cnt1[n]+cnt2[n],我们只用维护cnt3[j]-cnt2[j]的后缀最小值即可。
注意:因为可能有一个人或两个人没有任何数,那么此时i和j是可以相等的,比如i==j时第二个人没有数,i==j==0时第1、2个人没有数,i==j==n时第二、三个人没有数,i==0&&j==n时第1、3个人没有数,等等情况
代码
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=200005;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int a[4][N];
int c[4][N],mn[N];
int main()
{
std::ios::sync_with_stdio(false);
int k1,k2,k3;
cin>>k1>>k2>>k3;
int n=k1+k2+k3;
for(int i=1;i<=k1;i++)
{
cin>>a[1][i];
++c[1][a[1][i]];
}
for(int i=1;i<=k2;i++)
{
cin>>a[2][i];
++c[2][a[2][i]];
}
for(int i=1;i<=k3;i++)
{
cin>>a[3][i];
++c[3][a[3][i]];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=3;j++)
{
c[j][i]+=c[j][i-1];
}
}
mn[n+1]=inf;
for(int i=n;i>=0;i--)
{
mn[i]=min(mn[i+1],c[3][i]-c[2][i]);
}
int ans=inf;
for(int i=0;i<=n;i++)
{
ans=min(ans,c[2][i]-c[1][i]+mn[i]+c[1][n]+c[2][n]);
// cout<<i<<" "<<ans<<endl;
}
cout<<ans<<endl;
return 0;
}
CodeForces - 1257E (思维)的更多相关文章
- Codeforces 424A (思维题)
Squats Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Statu ...
- Codeforces 1060E(思维+贡献法)
https://codeforces.com/contest/1060/problem/E 题意 给一颗树,在原始的图中假如两个点连向同一个点,这两个点之间就可以连一条边,定义两点之间的长度为两点之间 ...
- Queue CodeForces - 353D (思维dp)
https://codeforces.com/problemset/problem/353/D 大意:给定字符串, 每一秒, 若F在M的右侧, 则交换M与F, 求多少秒后F全在M左侧 $dp[i]$为 ...
- codeforces 1244C (思维 or 扩展欧几里得)
(点击此处查看原题) 题意分析 已知 n , p , w, d ,求x , y, z的值 ,他们的关系为: x + y + z = n x * w + y * d = p 思维法 当 y < w ...
- CodeForces - 417B (思维题)
Crash Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit Status ...
- CodeForces - 417A(思维题)
Elimination Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Submit ...
- CodeForces 625A 思维
题意是说一个人喝酒 有两种办法 买塑料瓶的 a块钱 喝了就没了 或者是买玻璃瓶的b块钱 喝完还能卖了瓶子c块钱 求最多能喝多少瓶 在开始判断一次 a与b-c的关系 即两种方式喝酒的成本 如果a< ...
- Vladik and Complicated Book CodeForces - 811B (思维实现)
Vladik had started reading a complicated book about algorithms containing n pages. To improve unders ...
- The Contest CodeForces - 813A (思维)
Pasha is participating in a contest on one well-known website. This time he wants to win the contest ...
随机推荐
- 示例:Oracle表锁、行锁模拟和处理
for update模拟锁表 --session 1 SQL> select * from tt for update; --session 2 SQL> update tt set id ...
- Redis—简介与安装
Redis 简介 Redis 安装 Redis 配置文件 # Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程.daemonize yes # 当Redis以守护进 ...
- Educational Codeforces Round 71 (Rated for Div. 2)
传送门 A.There Are Two Types Of Burgers 签到. B.Square Filling 签到 C.Gas Pipeline 每个位置只有"高.低"两种状 ...
- 机器学习--用PCA算法实现三维样本降到二维
对于维数比较多的数据,首先需要做的事就是在尽量保证数据本质的前提下将数据中的维数降低.降维是一种数据集预处理技术,往往在数据应用在其他算法之前使用,它可以去除掉数据的一些冗余信息和噪声,使数据变得更加 ...
- Python Django,事务,transaction.atomic,事务保存点
from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic imp ...
- 阿里云服务器 ECS Jenkins 安装教程
参考:https://blog.csdn.net/liqing0013/article/details/83930419
- 【JS】JS实现Html转义和反转义(html编码和解码)的方法总结
1.JS实现html转义和反转义主要有两种方式: 1).利用用浏览器内部转换器实现html转义: 2).用正则表达式实现html转义: 2.封装的JS工具类: var HtmlUtil = { /*1 ...
- 最热门的 10 个 Java 微服务框架
1.Spring Boot Java 构建 Spring 应用程序已经有很长一段时间了,Spring Boot 是 Spring 的一个特定版本,它通过对配置细节的处理,使微服务构建更加简便.创建 S ...
- 史上最全HashMap遍历方式
java Hashmap Map TreeMap 的几种遍历方式,全网最全,全网最强 package Collec2; import java.util.HashMap; import java.ut ...
- 13-scrapy中selenium的应用
一. 引入 在通过scrapy框架进行某些网站数据爬取的时候,往往会碰到页面动态数据加载的情况发生,如果直接使用scrapy对其url发请求,是绝对获取不到那部分动态加载出来的数据值.但是通过观察我们 ...