Codeforces Round #552 (Div. 3)-1154E-Two Teams-(模拟+双指针)
http://codeforces.com/contest/1154/problem/E
解题:
举例n=10,k=1
1,2,10,4,7,6,9,8,5,3
第一次,1队先挑2,10,4这三个人
1,2,10,4,7,6,9,8,5,3
第二次,2队挑6,9,8三个人
1,2,10,4,7,6,9,8,5,3
第三次,1队挑1,7,5三个人
1,2,10,4,7,6,9,8,5,3
第四次,2队挑3一个人
1,2,10,4,7,6,9,8,5,
显然需要实现的有两点
(1)挑完后的“连接”,比如
第一次挑完后需要把1和7“连接”起来
第二次挑完后需要把7和5“连接”起来
用l数组标记当前下标 左边相邻的数的下标
用r数组标记当前下标 右边相邻的数的下标
例如一开始:
r[1]=2,表示下标为1的人(1)的右边是下标为2那个人(2)
l[5]=4,表示下标为5的人(7)的左边是下标为3那个人(4)
第一次挑完之后
r[1]=5,表示下标为1的人(1)的右边是下标为5那个人(7)
l[5]=1,表示下标为5的人(7)的左边是下标为1那个人(1)
每次挑完人后把已经挑选的人“删掉”,左右扩散找人可以通过左右数组来找人,直接跳过被挑选过的人,实现“删掉”,
(2)快速找最大值,暴力寻找肯定会超时
一般遇到n个不同的数随机出现在数组里,可以用下标数组idx标记这个数出现的下标位置,直接查找。
dix[10]=3表示10这个数在原数组的下标位置是3
这里可以从n开始减小,一直减到1,时间复杂度O(n)
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<vector>
#include<iostream>
#include<cstring>
#include<set>
#include<queue>
#define inf 0x3f3f3f3f
#define ll long long
using namespace std; int n,k,maxxidx,maxx;
int a[];
int l[];///下标为i的人 的左边 下标是多少
int r[];///下标为i的人 的右边 下标是多少
int idx[];///标记原数组下标
int ans[]; void findmax()///找最大值,主要是改变全局变量maxxidx和maxx
{
while(maxx>=)
{
if( ans[ idx[maxx] ]== )
{
maxxidx=idx[ maxx ];
break;
}
maxx--;
}
} int main()
{
while(scanf("%d%d",&n,&k)!=EOF)
{
memset(a,,sizeof(a));
memset(l,,sizeof(l));
memset(r,,sizeof(r));
memset(idx,,sizeof(idx));
memset(ans,,sizeof(ans));
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
idx[ a[i] ]=i;
l[i]=i-;
r[i]=i+;
}
l[n+]=n;
r[]=;
maxxidx=idx[n];///初始化为最大的下标
maxx=n;
int now=;///当前已经选了多少人
int t=;///初始是1队先挑人
while(now<n)
{
findmax();
int i=maxxidx;///最大的那个人的下标
ans[i]=t;
now++;
int x=l[i];
int y=r[i];///中间向左右两边扩展
for(int j=;j<=k;j++)
{
if(x>= && x<=n)///如果x是0表明左边无人了
ans[x]=t,x=l[x],now++;///通过左右指针数组找下一个人
if(y>= && y<=n)
ans[y]=t,y=r[y],now++;
}
///挑完人就该改左右下标了
l[y]=x;
r[x]=y;
if(t==)
t=;
else
t=;
}
for(int i=;i<=n;i++)
printf("%d",ans[i]);
printf("\n");
}
return ;
}
Codeforces Round #552 (Div. 3)-1154E-Two Teams-(模拟+双指针)的更多相关文章
- Codeforces Round #552 (Div. 3) E. Two Teams (模拟,优先队列,双向链表)
题意:有\(n\)个队员站成一排,有两个教练分别选人,每次选当前剩余人中的能力值最大的那个以及他两边相邻的\(k\)个人,问最后每个人所在队伍情况. 题解:优先队列模拟,以及双向链表,先用结构体存入每 ...
- Codeforces Round #552 (Div. 3) 题解
Codeforces Round #552 (Div. 3) 题目链接 A. Restoring Three Numbers 给出 \(a+b\),\(b+c\),\(a+c\) 以及 \(a+b+c ...
- Codeforces Round #552 (Div. 3) A题
题目网址:http://codeforces.com/contest/1154/problem/ 题目意思:就是给你四个数,这四个数是a+b,a+c,b+c,a+b+c,次序未知要反求出a,b,c,d ...
- Codeforces Round #368 (Div. 2) B. Bakery (模拟)
Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...
- Codeforces Round #284 (Div. 2)A B C 模拟 数学
A. Watching a movie time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Codeforces Round #285 (Div. 2) A B C 模拟 stl 拓扑排序
A. Contest time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- Codeforces Round #273 (Div. 2)-B. Random Teams
http://codeforces.com/contest/478/problem/B B. Random Teams time limit per test 1 second memory limi ...
- Codeforces Round #552 (Div. 3) F. Shovels Shop (前缀和预处理+贪心+dp)
题目:http://codeforces.com/contest/1154/problem/F 题意:给你n个商品,然后还有m个特价活动,你买满x件就把你当前的x件中最便宜的y件价格免费,问你买k件花 ...
- Codeforces Round #552 (Div. 3) F题
题目网址:http://codeforces.com/contest/1154/problem/F 题目大意:给出n,m,k,n是物体的个数,m是优惠方式的种数,k是需要购买的物体个数, 然后给出n个 ...
- Codeforces Round #552 (Div. 3) D题
题目网站:http://codeforces.com/contest/1154/problem/D 题目大意:给出n个数(0或1),还有a , b, a是蓄电池容量,b是电池容量,数为1时蓄电池可以充 ...
随机推荐
- c++11多线程记录0
两种并发编程模型 多进程 进程间通信常用的几种方式: 文件 管道 消息队列 多线程 一个进程中存在的多个线程,通常通过共享内存来通信,(说的非常非常粗俗,就是通过类似"全局变量"的 ...
- JWT与RBAC权限模型
JWT JWT是什么? Json web token (JWT)是为了网络应用环境间传递声明而执行的一种基于JSON的开发标准(RFC7519),该token被设计为紧凑且安全的,特别适用于分布式站点 ...
- SQL Server的外键必须引用的是主键或者唯一键(转载)
问: In SQL Server , I got this error -> "There are no primary or candidate keys in the refere ...
- php 安装imap报错“configure: error: utf8_mime2text() has new signature”解决
环境:php官方docker镜像 php:7.2-apache 安装IMAP扩展模块执行命令:docker-php-ext-install imap 报错信息:configure: error: ut ...
- Java自学-类和对象 包
Java中的 包 包: package 把比较接近的类,规划在同一个包下 步骤 1 : 把比较接近的类,规划在同一个包下 Hero,ADHero 规划在一个包,叫做charactor(角色) Item ...
- PAT 1003我要通过!
PAT 1003 我要通过! 答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出&qu ...
- Tomcat配置https加密连接
配置https安全连接(ssl加密连接) https连接需要用到数字证书与数字签名(MD5算法),网站https连接首先需要申请数字证书,配置加密连接器,浏览器安装证书. 证书运用到RSA技术,RSA ...
- 很带劲,Android9.0可以在i.MX8开发板上这样跑
米尔MYD-JX8MX开发板移植了Android9.0操作系统,现阶段最高版本的Android9.0操作系统将给您的产品在安全与稳定性方面带来更大的提升.可惜了,这里不能上传视频在i.MX8开发板跑A ...
- pandas-17 关于nan的处理
pandas-17 关于nan的处理 在pandas中有个另类的存在就是nan,解释是:not a number,不是一个数字,但是它的类型确是一个float类型.numpy中也存在关于nan的方法, ...
- sqlserver建表及注释
--**********************************************创建表************************************************* ...