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-(模拟+双指针)的更多相关文章

  1. Codeforces Round #552 (Div. 3) E. Two Teams (模拟,优先队列,双向链表)

    题意:有\(n\)个队员站成一排,有两个教练分别选人,每次选当前剩余人中的能力值最大的那个以及他两边相邻的\(k\)个人,问最后每个人所在队伍情况. 题解:优先队列模拟,以及双向链表,先用结构体存入每 ...

  2. Codeforces Round #552 (Div. 3) 题解

    Codeforces Round #552 (Div. 3) 题目链接 A. Restoring Three Numbers 给出 \(a+b\),\(b+c\),\(a+c\) 以及 \(a+b+c ...

  3. 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 ...

  4. Codeforces Round #368 (Div. 2) B. Bakery (模拟)

    Bakery 题目链接: http://codeforces.com/contest/707/problem/B Description Masha wants to open her own bak ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. Codeforces Round #552 (Div. 3) F. Shovels Shop (前缀和预处理+贪心+dp)

    题目:http://codeforces.com/contest/1154/problem/F 题意:给你n个商品,然后还有m个特价活动,你买满x件就把你当前的x件中最便宜的y件价格免费,问你买k件花 ...

  9. Codeforces Round #552 (Div. 3) F题

    题目网址:http://codeforces.com/contest/1154/problem/F 题目大意:给出n,m,k,n是物体的个数,m是优惠方式的种数,k是需要购买的物体个数, 然后给出n个 ...

  10. Codeforces Round #552 (Div. 3) D题

    题目网站:http://codeforces.com/contest/1154/problem/D 题目大意:给出n个数(0或1),还有a , b, a是蓄电池容量,b是电池容量,数为1时蓄电池可以充 ...

随机推荐

  1. Ansible14:Playbook条件语句

    目录 简介 when关键字 1. when基本使用 2. 比较运算符 3. 逻辑运算符 条件判断与tests 判断变量 判断执行结果 判断路径 判断字符串 判断整除 其他tests 条件判断与bloc ...

  2. C++动态规划求解0-1背包问题

    问题描述: 给定n种物品和一背包.物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,是的装入背包中物品的总价值最大? 细节须知: 暂无. 算法原理: a.最优子结构性质 ...

  3. 【题解】Luogu P2992 [USACO10OPEN]三角形计数Triangle Counting

    原题传送门 我们考虑进行容斥 包含原点的三角形个数=所有可能三角形的个数-不包含原点三角形的个数 对于每个点,我们会发现:将它与原点连线,在直线左边任选两点或右边任选两点与这个点构成的三角形一定是不包 ...

  4. 关于redis key命名规范的设计

    一.实现目标 简洁,高效,可维护 二.键值设计规约 1 . Redis key命名风格 [推荐]Redis key命名需具有可读性以及可管理性,不该使用含义不清的key以及特别长的key名: [强制] ...

  5. java版的状态机实现

    状态机适用场景: C的操作,需要等到A.B的两个操作(A.B顺序操作),那就需要在 A.B之间创建一个状态机(state machine),C的操作需要状态机达到某一个状态才能进行 1. Overvi ...

  6. lazyload的使用方法

    http://blog.csdn.net/peidandan/article/details/8107634

  7. css 光标

    <style> div{width:100;height:50;float:left;border:1px solid red;margin:1px;} </style> &l ...

  8. T-SQL 批量更新字段

    ;WITH IdPhone AS ( SELECT * FROM(VALUES ('), ('), ('), ('), ('), ('), ('), ('), ('), (') ) AS v(Id, ...

  9. 测试欧气的小游戏-java

    Java 用我们学到的知识做处一个小的项目或者游戏等等应该都或多或少的有一点点的成就感吧,下列就是我用所学的基础知识做的猜字谜游戏,并且给他赋予了灵魂哈哈哈.有兴趣的可以尝试的用自己会的知识做一些小的 ...

  10. java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libjni_i

    出错log:java.lang.UnsatisfiedLinkError: dlopen failed: library "/system/lib/libskytvjni.so" ...