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++ 结构体、模板、类、重载初使用
目的:需要几个缓存用的数组900*750 首先定义一个模板<参数数据类型,参数1,参数2> 定义一个class类 名字自己取ap_uint0 下面是公用的数组模板[lrow][lcol] ...
- 『2019Summer Algorithms』
一个暑假两次集训,感觉学了好多好多的东西,也挖了好多好多的坑,于是就决定写一篇关于算法的总结,用于熟悉新算法,也留下一点对新算法的理解. AC自动机 简单的说就是在\(trie\)树上实现\(KMP\ ...
- WPF调用C++生成的dll文件(示例)
注:笔者使用的VS版本为2019.1.打开VS2019,选择文件 -> 新建 -> 项目 2.选择项目 新建项目时选择C++“控制台应用”语言:C++平台:Windows项目类型:空项目 ...
- 经实验验证,修正对using namespace std的认识
备注①:name:符号.指的实体包括:变量.函数.类 备注②:认为全局命名空间也是一个包,在此称作 ROOT:: 或 global:: (这样就有了两个特别的包:一个是全局包,一个是std包.但对于编 ...
- 指针总结指向const的指针、const指针、指向const指针的const指针
指针的一些总结 const与指针 指向const的指针指的是指针指向的数据是常量,不可以被修改,但指针变量本身可以被修改,如const int *p:严格说不能用指针间接修改指向的数据,但该变量可 ...
- uni-app悬浮框模板
1. uni-app悬浮框模板 1.1. 目标 模仿饿了吗app的悬浮框效果,即上移过程中,中间的某个组件框到顶部后不再上移,呈类似置顶的效果 1.2. 问题 中间遇到fixed固定组件导致flex失 ...
- 英语fraunce法兰西
fraunce 外文词汇,中文翻译为代指法兰西(地名) 中文名:法兰西 外文名:fraunce 目录 释义 Fraunce 读音:英 [frɑ:ns] 美 [fræns] Noun(名词) 1. ...
- Python学习日记(三十六) Mysql数据库篇 四
MySQL作业分析 五张表的增删改查: 完成所有表的关系创建 创建教师表(tid为这张表教师ID,tname为这张表教师的姓名) create table teacherTable( tid int ...
- 针对源代码和检查元素不一致的网页爬虫——利用Selenium、PhantomJS、bs4爬取12306的列车途径站信息
整个程序的核心难点在于上次豆瓣爬虫针对的是静态网页,源代码和检查元素内容相同:而在12306的查找搜索过程中,其网页发生变化(出现了查找到的数据),这个过程是动态的,使得我们在审查元素中能一一对应看到 ...
- 【OS_Windows】Win10应用商店闪退和点击Cortana搜索框闪退的解决方法
Windows10用户遇到了打开应用商店时闪退和点击Cortana小娜搜索框闪退的问题,并且在微软社区求助,得到了一种可行的解决方法,那就是查看Network List Service(网络列表服务) ...